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的说法,“破坏一些令人作呕的简单(但冗长的)数学”以获得秒,分,小时等,并将这些数据传回__init__一个新的timedelta.或者是否有更简单的方法?
最佳答案
模块pytimeparse受到How to construct a timedelta object from a simple string的启发,似乎通过返回秒数来完成繁重的工作.我只是在它周围放了一个包装器,它返回一个具有相同秒数的timedelta对象:
原文链接:https://www.f2er.com/python/438658.html#!/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对象与原始对象相同,即使用毫秒和微秒初始化任意数字也是如此.