нужно среднюю из списка объектов timedelta

Я создал список объектов timedelta и мне нужно получить в среднем этот список. когда я пытаюсь сделать

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

Я получаю TypeError: неподдерживаемый тип(ы) операнда для+: 'int' и 'datetime.timedelta'

Я новичок в работе с классами pythons datetime. Я также хотел бы знать, как получить это среднее значение в формате days: hours: mins: мне не нужно ничего меньше, чем mins.

4 ответов


sum хочет начальное значение, которое является 0 по умолчанию, но 0 не может быть добавлен в timedelta поэтому вы получаете ошибку.

вы просто должны дать sum a timedelta() в качестве начального значения:

# this is the average
return sum(delta_list, timedelta()) / len(delta_list)

чтобы распечатать его, вы можете сделать следующее:

print str(some_delta)

если вы хотите что-то настроить, вы можете получить some_delta.days и some_delta.seconds но вы должны рассчитать все между.


прежде всего,sum добавляет все элементы из списка, чтобы начальное значение, которое по умолчанию 0 (целое число со значением ноль). Таким образом, чтобы иметь возможность использовать sum в список timedeltas, вам нужно пройти - sum(delta_list, timedelta(0)).

во-вторых, почему вы хотите, чтобы вычесть из длины списка? Если список имеет длину 1 вы получите ZeroDivisionError.

исправив вышеизложенное, вы получите timedelta объект является средним. Как преобразуйте это в удобочитаемый формат, который я оставляю для вас в качестве упражнения. The документация по модулю datetime должна отвечать на все возможные вопросы.


на sum() функции требуется начальное значение для добавления всех элементов в iterable to. Значение по умолчанию 0 вот почему вы получаете ошибку о добавлении timedelta до int.

чтобы исправить это, просто передать timedelta объект в качестве второго аргумента sum:

(создание timedelta без аргументов создает один, соответствующий нулевой разнице во времени.)

кроме того, среднее значение набора элементов обычно является суммой элементов делится на количество элементов, поэтому вам не нужно вычитать 1 из len(delta_list).

эти изменения означают, что мы можем удалить некоторые скобки из вашего заявления.

так что это дает вам:

return sum(delta_list,timedelta()) / len(delta_list)

A 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.