需要从一系列时间差对象中计算平均值

16 投票
4 回答
10011 浏览
提问于 2025-04-16 11:52

我创建了一个包含timedelta对象的列表,现在我想计算这个列表的平均值。当我尝试这样做时,

return (sum(delta_list)/(len(delta_list)-1))

我得到了

TypeError: unsupported operand type(s) for +: 'int' and 'datetime.timedelta'

我刚开始接触Python的datetime类。我还想知道如何把这个平均值转换成像天:小时:分钟这样的格式,我不需要比分钟更小的单位。

4 个回答

3

sum() 函数需要一个起始值,用来把可迭代对象里的所有项加起来。默认的起始值是 0,所以你会看到关于把 timedeltaint 相加的错误。

要解决这个问题,只需把一个 timedelta 对象作为 sum 的第二个参数传入即可:

(创建一个没有参数的 timedelta 会得到一个表示零时间差的对象。)

另外,一组数据的平均值通常是所有项的总和除以项的数量,所以你不需要从 len(delta_list) 中减去 1。

这些改动意味着我们可以去掉你语句中的一些括号。

这样就可以得到:

return sum(delta_list,timedelta()) / len(delta_list)
4

首先,sum这个函数的作用是把列表里的所有元素加起来,默认的起始值是0(也就是数字零)。所以,如果你想对一个包含timedelta对象的列表使用sum,你需要传入一个timedelta(0)作为参数,也就是这样写:sum(delta_list, timedelta(0))

其次,为什么要从列表的长度中减去1呢?如果列表的长度是1,你就会遇到ZeroDivisionError这个错误。

解决了上面的问题后,你最终会得到一个timedelta对象,它表示的是平均值。至于如何把这个平均值转换成普通人能看懂的格式,我就留给你自己去练习了。你可以参考datetime模块的文档,里面应该能解答你所有可能的问题。

31

sum 函数需要一个起始值,默认是 0,但是 0 不能和 timedelta 相加,所以你会遇到错误。

你只需要给 sum 提供一个 timedelta() 作为起始值:

# this is the average
return sum(delta_list, timedelta()) / len(delta_list)

如果你想把结果打印出来,可以这样做:

print str(some_delta)

如果你想要一些自定义的内容,可以获取 some_delta.dayssome_delta.seconds,但你需要自己计算它们之间的所有内容。

撰写回答