2015-06-08 3 views
-3

Учитывая следующий список:Получить среднее время

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' 
+1

И какая ошибка? –

+1

Дубликат для части A: http://stackoverflow.com/q/4049825/3001761 – jonrsharpe

ответ

5

Есть две проблемы:

  • 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 
0

Другой вариант заключается в использовании список понимание, чтобы получить список floats, который можно резюмировать:

avg = sum([t.total_seconds() for t in times])/len(times) 

# avg == 0.851621666667 

Но, как сказал Мартин, это точнее суммировать timedelta объектов вместе, начиная с пустого.

Смежные вопросы