首页 > 解决方案 > 如何在 python 中将 timedeltas 总和超过 24 小时?

问题描述

如何在循环中求和 timedeltas?如果我手动添加时间增量,则总和是正确的。但是,如果我使用 while 循环来求和 timedeltas,我会收到此错误:

TypeError:只能将str(不是“datetime.timedelta”)连接到str

另一个问题是,如果总和值超过 24 小时 - python 将总和打印为一天和 x 小时。例如,我需要 26:15(26 小时 15 分钟)的总和值。

import datetime

fmt = '%H%M'
start = [];end = [];td = []

start.append( datetime.datetime.strptime('0300', fmt) )
start.append( datetime.datetime.strptime('0645', fmt) )

end.append( datetime.datetime.strptime('1505', fmt) )
end.append( datetime.datetime.strptime('1845', fmt) )

td.append( end[0] - start[0] )
td.append( end[1] - start[1] )

print('timedelta1= ' + str(td[0]))
print('timedelta2= ' + str(td[1]))

tSum = td[0] +td[1]
print( 'Sum: ' + str(tSum) )

tSumLoop = ''
i = 0
while i < 2:
    tSumLoop += td[i]
    i += 1
print(tSumLoop)

我该如何解决这两个问题?谢谢你的帮助!

标签: python-3.x

解决方案


您可以将起始值用作零 timedelta: datetime.timedelta(0)

tSumLoop = datetime.timedelta(0)
i = 0
while i < 2:
    tSumLoop += td[i]
    i += 1
print(tSumLoop)

或使用sum()

tSum = sum(td, datetime.timedelta(0))
print( 'Sum:', tSum )

印刷:

Sum: 1 day, 0:05:00

编辑:要格式化总和,您可以使用(基于https://stackoverflow.com/a/62719270/10035985

def period(delta, pattern):
    d = {}
    d['h'], rem = divmod(delta.total_seconds(), 3600)
    d['m'], d['s'] = divmod(rem, 60)
    return pattern.format(**d)

tSum = sum(td, datetime.timedelta(0))
print(period(tSum, '{h:>02.0f}:{m:>02.0f}'))

印刷:

24:05

推荐阅读