2016-11-25 879 views
4

Dateutil的timedelta對象似乎有一個自定義的__str__方法:如何將timedelta轉換爲字符串,然後再返回

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__。或者有可能是一種更簡單的方法?

回答

1

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用任意數字初始化。

0

如何使用泡菜?您可以參考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) 
+0

謝謝,但我寧願將表示形式作爲人類可讀字符串而不是字節序列。 –

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) 
+0

從'datetime'的源代碼(它似乎可在https://svn.python.org/projects/sandbox/trunk/datetime/datetime.py獲得),它會從'__str__'方法定義中出現如果'timedelta'包含幾天或幾微秒,則會有一些特殊更改。它看起來像[pytimeparse](https://pypi.python.org/pypi/pytimeparse/1.1.5)的作者Will Roberts已經(苦心地)涵蓋了所有這些情況。 –

相關問題