需要timedelta对象列表的平均值

问题描述 投票:16回答:4

我创建了timedelta个对象的列表,我需要获取该列表的平均值。当我尝试做

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

我得到

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

我是使用python的datetime类的新手。我还想知道如何将这种平均数转换为天数:小时数:分钟数:我不需要比分钟数小的任何数字。

python datetime timedelta
4个回答
28
投票

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,但必须计算之间的所有内容。


4
投票

首先,sum将列表中的所有元素添加到初始值,默认值为0(值为零的整数)。因此,要在sum的列表上使用timedelta,您需要传递timedelta(0)参数-sum(delta_list, timedelta(0))

第二,为什么要从列表的长度中减去一个?如果列表的长度为1,您将获得ZeroDivisionError

已解决上述问题,最后将timedelta对象作为平均值。如何将其转换为人类可读的格式,我留给您作为练习。 datetime module documentation应该回答所有可能的问题。


3
投票

sum() function需要一个初始值,以将所有可迭代项添加到。它默认为sum(),这就是为什么在将0添加到timedelta时出现错误的原因。

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

(创建不带参数的sum会创建一个对应于零时差的参数。]

此外,一组项目的平均值通常是项目总和除以项目数,因此您无需从timedelta中减去1。

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

所以这给你:

len(delta_list)

1
投票

return sum(delta_list,timedelta()) / len(delta_list) 对象具有访问天,微秒和秒的属性。您可以轻松引用这些内容,例如:

datetime.timedelta

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

© www.soinside.com 2019 - 2024. All rights reserved.