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
オブジェクトを返します(cf. 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)
これを行うために私が今見ている唯一の方法は、 タイムデルタを日、時間、分に変換する の用語で、 '秒を取得するために'不快なほど単純な(しかし冗長な)数学を無効にすることです分、時間など、これらを新しいtimedelta
の__init__
に戻します。それとももっと簡単な方法はありますか?
単純な文字列からtimedeltaオブジェクトを構築する方法 に触発されたモジュール 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
オブジェクトは、milliseconds
およびmicroseconds
の場合、任意の数で初期化された場合でも、元のオブジェクトと同じです。
使用する - 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)
漬物はいかがですか? 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)