获得平均次数

时间:2015-06-08 18:53:27

标签: python

给出以下列表:

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'

2 个答案:

答案 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个对象加在一起更加准确,从一个空对象开始。