我有一个类似下面的字符串"0:07:38.701"
,表示 0 小时、7 分钟、38 秒和 701 毫秒。
然后我有一个datetime
如下对象:datetime.datetime(1945, 1, 3, 11, 45, 0, 44000)
我想添加这些时间(第一个是增量,而第二个是绝对时间参考)并获得一个新datetime.datetime
对象。
我怎样才能做到这一点?
一旦你有了 adatetime
和 a timedelta
,添加它们就像使用+
运算符一样简单:
>>> dt = datetime.datetime(1945, 1, 3, 11, 45, 0, 44000)
>>> td = datetime.timedelta(hours=0, minutes=7, seconds=38.701)
>>> dt + td
datetime.datetime(1945, 1, 3, 11, 52, 38, 745000)
timedelta
没有类似于对象strptime
的内置对象解析器datetime
。
有时您可以通过将字符串实际解析为 a 来伪造它datetime
,然后提取字段以构建 a timedelta
,但这既复杂又复杂——而且,对于您的简单格式,您可以简单地编写一个:
def strpdelta(s):
hr, min, sec = map(float, s.split(':'))
return datetime.timedelta(hours=hr, minutes=min, seconds=sec)
另一种解决方案,也是我迄今为止最喜欢的一种解决方案,因为它不需要手动解析并使用现有功能datetime
来解析字符串格式的日期:
# Input times:
init_time = datetime.datetime(1945, 1, 3, 11, 45, 0, 44000)
time_to_add_str = '0:00:05.00'
# Adding them up:
time_to_add = datetime.strptime(time_to_add_str, '%H:%M:%S.%f') - datetime(1900,1,1)
final_time = time_to_add + init_time
您可以使用时间增量:
>>> import datetime, re
>>> s = "0:07:38.701"
>>> hours, minutes, seconds = [float(val) for val in s.split(':')]
>>> delta = datetime.timedelta(hours=hours, minutes=minutes, seconds=seconds)
>>> datetime.datetime(1945, 1, 3, 11, 45, 0, 44000) + delta
datetime.datetime(1945, 1, 3, 11, 52, 38, 745000)
编辑:正如评论中指出的那样, timedelta 可以处理浮点值。即如果seconds=38.701
,它会将其转换为seconds
和milliseconds
from datetime import timedelta, datetime
dtime = datetime(1945, 1, 3, 11, 45, 0, 44000)
str = "0:07:38.701"
elems = str.split(':')
hr, min, sec= int(elems[0]), int(elems[1]), float(elems[2])
tdelta = timedelta(hours=hr, minutes=min, seconds=sec)
new_datetime = dtime + tdelta
编辑前的版本:
from datetime import timedelta, datetime
dtime = datetime(1945, 1, 3, 11, 45, 0, 44000)
str = "0:07:38.701"
stuff = str.split(':')
elems = stuff[:-1] + stuff[2].split('.')
hr, min, sec, mls= int(elems[0]), int(elems[1]), int(elems[2], int(elems[3]))
tdelta = timedelta(hours=hr, minutes=min, seconds=sec, milliseconds=mls)
new_datetime = dtime + tdelta