Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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, но вам нужно рассчитать все между ними.

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

Объект

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.