Работа со значениями времени больше 24 часов
Как работать в Python с периодами времени более 24 часов? Я посмотрел на datetime.time
объект, но это, кажется, для обработки времени суток, а не времени в целом.
datetime.time
имеет требование 0 <= hour < 24
что делает его бесполезным, если вы хотите записать время более 24 часов, если я что-то упустил?
Скажем, например, я хотел вычислить общее время, отработанное кем-то. Я знаю время, которое они потратили на выполнение заданий индивидуально. Какой класс я должен использовать, чтобы безопасно рассчитать это общее время.
Мои входные данные будут выглядеть примерно так:
# The times in HH:MM:SS
times = ["16:35:21", "8:23:14"]
total_time = ? # 24:58:35
2 ответа
Как я понимаю, вы хотите сумму всех времен, а не разницы. Таким образом, вы можете преобразовать свое время в timedelta и затем суммировать его:
>>> from datetime import timedelta
# get hours, minutes and seconds
>>> tm1 = [map(int, x.split(':')) for x in times]
# convert to timedelta
>>> tm2 = [timedelta(hours=x[0], minutes=x[1], seconds=x[2]) for x in tm1]
# sum
>>> print sum(tm2, timedelta())
1 day, 0:58:35
К сожалению, нет встроенного способа для создания timedeltas из строк (например, strptime()
за datetime
объекты), поэтому мы должны построить парсер:
>>> from datetime import timedelta
>>> import re
>>> def interval(s):
"Converts a string to a timedelta"
d = re.match(r'((?P<days>\d+) days, )?(?P<hours>\d+):'
r'(?P<minutes>\d+):(?P<seconds>\d+)', str(s)).groupdict(0)
return timedelta(**dict(((key, int(value)) for key, value in d.items())))
>>> times = ["16:35:21", "8:23:14"]
>>> print sum([interval(time) for time in times])
1 day, 0:58:35
РЕДАКТИРОВАТЬ: Старый неправильный ответ (где я неправильно прочитал вопрос):
Если вы вычтете datetimes, вы получите объект timedelta:
>>> import datetime as dt
>>> times = ["16:35:21", "8:23:14"]
>>> fmt = '%H:%M:%S'
>>> start = dt.datetime.strptime(times[1], fmt )
>>> end = dt.datetime.strptime(times[0], fmt)
>>> diff = (end - start)
>>> diff.total_seconds()
29527.0
>>> (diff.days, diff.seconds, diff.microseconds)
(0, 29527, 0)
>>> print diff
8:12:07