我创建了一个timedelta对象列表,我需要获得此列表的平均值。当我尝试做的时候
return (sum(delta_list)/(len(delta_list)-1))
我得到TypeError:不支持的操作数类型+:'int'和'datetime.timedelta'
我是使用pythons datetime类的新手。我也想知道如何将这个平均值变成像天的格式:小时:分钟:我不需要任何小于分钟的东西。
答案 0 :(得分:27)
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
,但您必须计算其中的所有内容。
答案 1 :(得分:3)
sum()
function需要一个起始值来添加iterable中的所有项目。它默认为0
,这就是为什么您收到有关向timedelta
添加int
的错误。
要解决此问题,只需将timedelta
对象作为第二个参数传递给sum
:
(创建一个没有参数的timedelta
会创建一个与零时差相对应的颜色。)
此外,一组项目的平均值通常是项目总和除以项目数量,因此您无需从len(delta_list)
中减去1。
这些更改意味着我们可以从您的陈述中删除一些括号。
所以这会给你:
return sum(delta_list,timedelta()) / len(delta_list)
答案 2 :(得分:3)
首先,sum
将列表中的所有元素添加到初始值,默认为0
(值为零的整数)。因此,为了能够在sum
列表中使用timedelta
,您需要传递timedelta(0)
参数 - sum(delta_list, timedelta(0))
。
其次,为什么要从列表长度中减去一个?如果列表长度为1,您将获得ZeroDivisionError
。
修正了上述内容后,您最终会得到timedelta
个平均值的对象。如何将其转换为人类可读的格式我将作为练习留给您。 datetime module documentation应该回答所有可能的问题。
答案 3 :(得分:2)
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。