Понимание timedelta


90

Учитывая приведенный ниже код Python, пожалуйста, помогите мне понять, что там происходит.

start_time = time.time()
time.sleep(42)
end_time = time.time()

uptime = end_time - start_time

human_uptime = str(datetime.timedelta(seconds=int(uptime)))

Итак, я вижу разницу между start timeи end time, в строке 5 я округляю продолжительность с помощью кастинга, и что теперь, какое дальнейшее объяснение?

Я знаю, что означает дельта (среднее значение или разница), но почему я должен переходить seconds = uptimeк нему timedeltaи почему приведение строк работает так хорошо, что я получаю HH:MM:SS?

Ответы:


115

Потому что timedelta определяется как:

class datetime.timedelta([days,] [seconds,] [microseconds,] [milliseconds,] [minutes,] [hours,] [weeks])

Все аргументы являются необязательными и по умолчанию равны 0.

Таким образом можно легко сказать «Три дня и четыре миллисекунды» с необязательными аргументами.

>>> datetime.timedelta(days=3, milliseconds=4)
datetime.timedelta(3, 0, 4000)
>>> datetime.timedelta(3, 0, 0, 4) #no need for that.
datetime.timedelta(3, 0, 4000)

А для приведения str он возвращает хорошо отформатированное значение вместо того, __repr__чтобы улучшить читаемость. Из документов:

str (t) Возвращает строку в форме [D day [s],] [H] H: MM: SS [.UUUUUU], где D отрицательно для отрицательного значения t. (5)

>>> datetime.timedelta(seconds = 42).__repr__()
'datetime.timedelta(0, 42)'
>>> datetime.timedelta(seconds = 42).__str__()
'0:00:42'

Кассовая документация:

http://docs.python.org/library/datetime.html#timedelta-objects


13

почему я должен передавать секунды = время безотказной работы в timedelta

Поскольку объектам timedelta могут передаваться секунды, миллисекунды, дни и т. Д., Вам необходимо указать, что вы передаете (вот почему вы используете явный ключ). Приведение типов к intизлишне, поскольку они также могут принимать числа с плавающей запятой.

и почему преобразование строк работает так хорошо, что я получаю HH: MM: SS?

Это не приведение типов к форматированию, это внутренний __str__метод объекта. Фактически вы достигнете того же результата, если напишете:

print datetime.timedelta(seconds=int(uptime))

1
Вы намекаете на это, но стоит прямо отметить, что timedelta делает гораздо больше, чем просто отображает вещи в формате HH: MM: SS. Объект timedelta используется всякий раз, когда вам нужно различить два объекта datetime.
Wilduck

1
Это не __repr__метод, это __str__метод.
utdemir

1
Не __repr__()timedelta, а его __str__()метод. printзовет __str()__вас.
bgporter
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.