给出以下列表:
times = [datetime.timedelta(0, 1, 256273), datetime.timedelta(0, 0, 910417), datetime.timedelta(0, 0, 388175)]
我如何获得平均次数?执行以下操作会给我一个错误:
avg = (float(sum(times)) / len(times))
TypeError: unsupported operand type(s) for +: 'int' and 'datetime.timedelta'
答案 0 :(得分:6)
这里有两个问题:
sum()
以整数0
开始求和。您无法将timedelta()
对象添加到整数,因此会出现错误:
>>> import datetime
>>> times = [datetime.timedelta(0, 1, 256273), datetime.timedelta(0, 0, 910417), datetime.timedelta(0, 0, 388175)]
>>> sum(times)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'datetime.timedelta'
即使您可以直接使用sum()
,也无法通过将timedelta()
对象传递给float()
函数来将其转换为float()
:
>>> float(datetime.timedelta())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: float() argument must be a string or a number
您需要告诉sum()
以空timedelta
开头(从timedelta(0)
开始)并使用timedelta.total_seconds()
函数获取浮点数:
>>> sum(times, datetime.timedelta())
datetime.timedelta(0, 2, 554865)
>>> sum(times, datetime.timedelta()).total_seconds()
2.554865
>>> sum(times, datetime.timedelta()).total_seconds() / len(times)
0.8516216666666666
您可以省略.total_seconds()
部分并获取另一个timedelta()
对象:
>>> sum(times, datetime.timedelta()) / len(times)
datetime.timedelta(0, 0, 851621)
这将更准确。 除法后,您随时可以致电.total_seconds()
:
>>> (sum(times, datetime.timedelta()) / len(times)).total_seconds()
0.851621
答案 1 :(得分:0)
另一个选择是使用列表推导来获取floats
的列表,可以将其汇总:
avg = sum([t.total_seconds() for t in times]) / len(times)
# avg == 0.851621666667
但正如Martijn所说,将timedelta
个对象加在一起更加准确,从一个空对象开始。