如何将timedelta转换为字符串并再次返回

Kur*_*eek 7 python datetime python-dateutil

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

In [1]: from datetime import timedelta

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

In [3]: str(td)
Out[3]: '2:00:00'
Run Code Online (Sandbox Code Playgroud)

我想做的是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)
Run Code Online (Sandbox Code Playgroud)

我现在看到的唯一方法就是将转换时间转换为天,小时和分钟,"破坏一些令人作呕的简单(但冗长)数学"以获得秒,分,小时等,并将这些传递__init__给新的timedelta.或者是否有更简单的方法?

Spa*_*ine 7

使用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)
Run Code Online (Sandbox Code Playgroud)


Kur*_*eek 4

模块pytimeparse的灵感来自如何从简单的字符串构造 timedelta 对象,似乎通过返回秒数来完成繁重的工作。我只是在它周围放置一个包装器,它返回一个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()
Run Code Online (Sandbox Code Playgroud)

从测试中可以看出,重建的timedelta对象与原始对象相同,即使它是用任意数字 ifmilliseconds和初始化的microseconds