需要从一系列时间差对象中计算平均值
我创建了一个包含timedelta
对象的列表,现在我想计算这个列表的平均值。当我尝试这样做时,
return (sum(delta_list)/(len(delta_list)-1))
我得到了
TypeError: unsupported operand type(s) for +: 'int' and 'datetime.timedelta'
我刚开始接触Python的datetime
类。我还想知道如何把这个平均值转换成像天:小时:分钟这样的格式,我不需要比分钟更小的单位。
4 个回答
sum()
函数需要一个起始值,用来把可迭代对象里的所有项加起来。默认的起始值是 0
,所以你会看到关于把 timedelta
和 int
相加的错误。
要解决这个问题,只需把一个 timedelta
对象作为 sum
的第二个参数传入即可:
(创建一个没有参数的 timedelta
会得到一个表示零时间差的对象。)
另外,一组数据的平均值通常是所有项的总和除以项的数量,所以你不需要从 len(delta_list)
中减去 1。
这些改动意味着我们可以去掉你语句中的一些括号。
这样就可以得到:
return sum(delta_list,timedelta()) / len(delta_list)
首先,sum
这个函数的作用是把列表里的所有元素加起来,默认的起始值是0
(也就是数字零)。所以,如果你想对一个包含timedelta
对象的列表使用sum
,你需要传入一个timedelta(0)
作为参数,也就是这样写:sum(delta_list, timedelta(0))
。
其次,为什么要从列表的长度中减去1呢?如果列表的长度是1,你就会遇到ZeroDivisionError
这个错误。
解决了上面的问题后,你最终会得到一个timedelta
对象,它表示的是平均值。至于如何把这个平均值转换成普通人能看懂的格式,我就留给你自己去练习了。你可以参考datetime模块的文档,里面应该能解答你所有可能的问题。
sum
函数需要一个起始值,默认是 0
,但是 0
不能和 timedelta
相加,所以你会遇到错误。
你只需要给 sum
提供一个 timedelta()
作为起始值:
# this is the average
return sum(delta_list, timedelta()) / len(delta_list)
如果你想把结果打印出来,可以这样做:
print str(some_delta)
如果你想要一些自定义的内容,可以获取 some_delta.days
和 some_delta.seconds
,但你需要自己计算它们之间的所有内容。