麻烦求和 timedelta 对象;之前推荐的解决方案在 python 3.7 中不起作用

Trouble summing timedelta objects; previously recommended solutions don't work in python 3.7

我对这个关于求和时间增量对象的问题进行了跟进:

该问题的答案解释了 sum() 期望添加整数,您需要确保它知道您正在添加时间增量对象。解决方案是插入一个列表项“datetime.timedelta(0)”来给出 sum 提示。

我不明白我在 python 3.7 中遇到的这个错误。与其他问题一样,我需要时间增量对象的总和。正在尝试使用列表理解来提取 timedelta 值的代码,得到与其他问题相同的错误:

sum([i.time_idle for i in qalt])
*** TypeError: unsupported operand type(s) for +: 'int' and 'Timedelta'

令我困惑的是,我列表中的第二个对象实际上是上一个问题中推荐的解决方案。检查

[i.time_idle for i in qalt]
[Timedelta('0 days 00:18:40.649903'), datetime.timedelta(0)]

我可以手动添加时间增量对象:

 tlist = [i.time_idle for i in qalt]
 tlist[0] + tlist[1]
 Timedelta('0 days 00:18:40.649903')

但是求和功能还是不行

 sum(tlist)
*** TypeError: unsupported operand type(s) for +: 'int' and 'Timedelta'

如果你想玩这个,我相信下面提供了一个 MRE 测试用例:

 klist = [datetime.timedelta(days=0, hours=0, minutes=18, seconds=40), datetime.timedelta(0)]

你会看到 sum(klist) 失败了,但是 运行 klist[0] + klist[1]

我正在使用一种可以追溯到我的 C 根的变通方法:

time_idle_total = datetime.timedelta(seconds=0)
for i in qalt:
    time_idle_total += i.time_idle

您可以根据解决方法循环来考虑它:

time_idle_total = datetime.timedelta(seconds=0)
for i in qalt:
    time_idle_total += i.time_idle

sum 所做的实际上是这样的:

time_idle_total = 0
for i in qalt:
    time_idle_total += i.time_idle

sum 的第二个参数给出了开始求和的初始值,但是你只将一个参数传递给 sum (一个列表恰好有一个 timedelta 零作为它的第二个元素) .所以你仍然需要使用 sum([i.time_idle for i in qalt], datetime.timedelta(0))

注意 sum((i.time_idle for i in qalt), datetime.timedelta(0)) 应该稍微快一点(生成器理解而不是列表)。