在Python中计算时间间隔的总和

4
我想在Python中添加一系列拆分。时间从字符串开始,如“00:08:30.291”。我似乎找不到使用Python对象或API使其方便/优雅的正确方法。似乎时间对象不使用微秒,因此我正在使用datetime的strptime解析字符串,成功地完成了此操作。但是,datetimes似乎不能相加,我真的不想溢出到天数(即23 + 2小时= 25小时)。我可以使用datetime.time,但它们也不能相加。Timedeltas似乎很合适,但从/到其他事物的转换似乎有点棘手。也许我在这里漏掉了一些明显的东西。我希望能够:
for timestring in times:
    t = datetime.strptime("%H:%M:%S.%f", timestring).time
    total_duration = total_duration + t
print total_duration.strftime("%H:%M:%S.%f")

1
我更喜欢不要溢出到天数。这是什么意思?23小时+2小时应该等于什么? - SilentGhost
@SilentGhost:我想应该是很多小时,比如那个情况下可能是25个小时。 - unwind
是的,最好是25个字符。如果你愿意,也可以将其视为非必要内容。 - Sam Brightman
@Sam Brightman,您是指 duration.days*24*60*60 + duration.seconds 吗?如果是,请在问题中写明。 - S.Lott
我的问题与API的笨拙有关,尽管我在评论中立即澄清了,但我不明白为什么你还是固执地坚持这一点。被接受的答案并没有真正避免手动拆分结构并将其放入新结构的笨拙。 - Sam Brightman
显示剩余2条评论
2个回答

13

你所处理的是时间差异,因此在这里使用 datetime.timedelta 是唯一合适的选择:

>>> import datetime
>>> d1 = datetime.datetime.strptime("00:08:30.291", "%H:%M:%S.%f")
>>> d1
datetime.datetime(1900, 1, 1, 0, 8, 30, 291000)
>>> d2
datetime.datetime(1900, 1, 1, 0, 2, 30, 291000)
>>> dt1 = datetime.timedelta(minutes=d1.minute, seconds=d1.second, microseconds=d1.microsecond)
>>> dt2 = datetime.timedelta(minutes=d2.minute, seconds=d2.second, microseconds=d2.microsecond)
>>> fin = dt1 + dt2
>>> fin
datetime.timedelta(0, 660, 582000)
>>> str(fin)
'0:11:00.582000'

请不要使用像sum这样的名称作为您的变量名,因为这会遮蔽内置函数。


当然可以工作,但是拆分结构并重新创建,特别是用于原型制作,这种方法不够优雅。是否有一种更简洁/更快捷的方法来使用当前的API?感觉timedelta应该有strptime或类似的东西。 - Sam Brightman
我在问题中重命名了变量。 - Sam Brightman
同样,它也被从strftime中排除了,并且似乎很难在日期/时间之间进行转换:d1.time仍然是一个datetime。 - Sam Brightman

0
import numpy as np

# read file with one duration per line
with open('clean_times.txt', 'r') as f:
    x = f.read()

# Convert string to list of '00:02:12.31'
# I had to drop last item (empty string)
tmp = x.split('\n')[:-1]

# get list of ['00', 02, '12.31']
tmp = [i.split(':') for i in tmp.copy()]

# create numpy array with floats
np_tmp = np.array(tmp, dtype=np.float)

# sum via columns and divide
# hours/24 minutes/60 milliseconds/1000
# X will be a float array [days, hours, seconds]
# Something like `array([ 0.        , 15.68333333,  7.4189    ])`
X = np_tmp.sum(axis=0) / np.array([24, 60, 1000])

我在这里很开心,但如果你需要像'15:41:07.518'这样的花式字符串作为输出,继续阅读

# X will be a float array [hours, hours, seconds]
X = np_tmp.sum(axis=0) / np.array([1, 60, 1000])

# ugly part
# Hours are integer parts
H = int(X[0]) + int(X[1])
# Minutes are  hour fractional part and integer minutes part
tmp_M = (X[0] % 1 + X[1] % 1) * 60
M = int(tmp_M)
# Seconds are minutes fractional part and integer seconds part
tmp_S = tmp_M % 1 * 60 + X[2]
S = int(tmp_S)
# Milliseconds are seconds fractional part
MS = int(tmp_S % 1 * 1000)

# merge string for output
# Something like '15:41:07.518'
result = f'{H:02}:{M:02}:{S:02}.{MS:03}'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接