【问题标题】:How to convert a timedelta to a string and back again如何将 timedelta 转换为字符串并再次返回
【发布时间】:2016-11-25 14:01:47
【问题描述】:

Dateutil 的 timedelta 对象似乎有一个自定义的 __str__ 方法:

In [1]: from datetime import timedelta

In [2]: td = timedelta(hours=2)

In [3]: str(td)
Out[3]: '2:00:00'

我想做的是从它的字符串表示中重新创建一个timedelta 对象。然而,据我所知,datetime.parser.parse 方法将始终返回一个datetime.datetime 对象(参见https://dateutil.readthedocs.io/en/stable/parser.html):

In [4]: import dateutil.parser

In [5]: dateutil.parser.parse(str(td))
Out[5]: datetime.datetime(2016, 11, 25, 2, 0)

我现在看到的唯一方法是,用Convert a timedelta to days, hours and minutes 的说法,“找出一些令人作呕的简单(但冗长)的数学”来获得秒、分钟、小时等,然后传递这些回到新的timedelta__init__。或者有没有更简单的方法?

【问题讨论】:

    标签: python datetime python-dateutil


    【解决方案1】:

    使用datetime.strptime 将字符串转换为timedelta。

    import datetime
    
    td = datetime.timedelta(hours=2)
    
    # timedelta to string
    s = str(td) # 2:00:00
    
    # string to timedelta
    t = datetime.datetime.strptime(s,"%H:%M:%S")
    td2 = datetime.timedelta(hours=t.hour, minutes=t.minute, seconds=t.second)
    

    【讨论】:

    【解决方案2】:

    How to construct a timedelta object from a simple string 启发的模块pytimeparse 似乎通过返回秒数来完成繁重的工作。我只是在它周围放了一个包装器,它返回一个具有相同秒数的 timedelta 对象:

    #!/usr/bin/env python3.5
    import datetime
    import pytimeparse
    import unittest
    
    def reconstruct_timedelta(td_string):
        seconds = pytimeparse.parse(td_string)
        return datetime.timedelta(seconds=seconds)
    
    class TestReconstruction(unittest.TestCase):
        def test_reconstruct_timedelta_is_inverse_of_str(self):
            td = datetime.timedelta(weeks=300, days=20, hours=3, minutes=4, milliseconds=254, microseconds=984)
            td_reconstructed = reconstruct_timedelta(str(td))
            self.assertTrue(td == td_reconstructed)
    
    if __name__ == "__main__":
        unittest.main()
    

    从测试中可以看出,重构的timedelta对象与原始对象相同,即使在millisecondsmicroseconds使用任意数字初始化时也是如此。

    【讨论】:

      【解决方案3】:

      用泡菜怎么样?你可以参考https://docs.python.org/2/library/pickle.html 序列化时间增量对象,稍后取回对象。

      import pickle 
      
      tdi = pickle.dumps(td)
      
      tdo = pickle.loads(tdi) # will have the time delta object 
      
      str(tdo) 
      

      【讨论】:

      • 谢谢,但我更愿意将表示形式作为人类可读的字符串而不是字节序列。
      猜你喜欢
      • 2015-01-19
      • 2013-02-18
      • 2011-01-13
      • 1970-01-01
      • 2011-10-30
      • 2012-11-01
      • 2011-11-15
      • 1970-01-01
      • 2016-11-04
      相关资源
      最近更新 更多