нужно среднее значение из списка объектов timedelta - PullRequest
15 голосов
/ 15 февраля 2011

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

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

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

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

Ответы [ 4 ]

27 голосов
/ 15 февраля 2011

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, но вы должны все посчитать.

3 голосов
/ 15 февраля 2011

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

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

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

3 голосов
/ 15 февраля 2011

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

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

(При создании timedelta без аргументов создается тот, который соответствует нулевой разнице во времени.)

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

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

Итак, это дает вам:

return sum(delta_list,timedelta()) / len(delta_list)
2 голосов
/ 15 февраля 2011

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.

...