16

我已经创建了一个timedelta对象列表,我需要得到这个列表的平均值。当我尝试做

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

我明白了

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

我是使用 pythondatetime类的新手。我也想知道如何将这个平均值转换为天:小时:分钟:我不需要任何小于分钟的格式。

4

4 回答 4

30

sum想要一个起始值,0默认情况下,但0不能添加到 atimedelta所以你得到错误。

您只需提供sumatimedelta()作为起始值:

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

要打印出来,你可以这样做:

print str(some_delta)

如果您想要定制的东西,您可以获得some_delta.dayssome_delta.seconds但您必须计算两者之间的所有内容。

于 2011-02-15T16:27:44.333 回答
4

首先,sum将列表中的所有元素添加到初始值,默认情况下为初始值0(值为 0 的整数)。因此,为了能够在 'ssum列表上使用timedelta,您需要传递一个timedelta(0)参数 - sum(delta_list, timedelta(0))

其次,为什么要从列表的长度中减去一个?如果列表的长度为 1,您将得到一个ZeroDivisionError.

修复上述问题后,您最终会timedelta得到一个平均值的对象。如何将其转换为人类可读的格式,我留给你作为练习。datetime 模块文档应该回答所有可能的问题。

于 2011-02-15T16:31:45.640 回答
3

sum()函数需要一个起始值来添加可迭代对象中的所有项目。默认情况下,0这就是您收到有关将 a 添加timedeltaint.

要解决此问题,只需将timedelta对象作为第二个参数传递给sum

(创建timedelta不带参数的 a 会创建一个对应于零时差的。)

此外,一组项目的平均值通常是项目的总和除以项目的数量,因此您不需要从 中减去 1 len(delta_list)

这些更改意味着我们可以从您的声明中删除一些括号。

所以这给了你:

return sum(delta_list,timedelta()) / len(delta_list)
于 2011-02-15T16:31:26.343 回答
1

datetime.timedelta对象具有访问天、微秒和秒的属性。您可以轻松引用这些内容,例如:

>>> import datetime
>>> daybefore = datetime.timedelta(days=1)
>>> dayminus2 = datetime.timedelta(days=2, minutes=60)
>>> daybefore.days
1
>>> dayminus2.days, dayminus2.seconds
(2, 3600)

要获得分钟,您必须将秒除以 60。

于 2011-02-15T16:30:54.617 回答