нужно среднюю из списка объектов 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
в список timedelta
s, вам нужно пройти - 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.