Как рассчитать временной интервал между двумя строками времени
У меня есть два раза, время начала и остановки, в формате 10:33:26 (чч:мм:СС). Мне нужна разница между двумя временами. Я просматривал документацию для Python и искал в интернете, и я бы предположил, что это будет иметь какое-то отношение к модулям datetime и/или time. Я не могу заставить его работать должным образом и продолжать находить только то, как это сделать, когда речь идет о дате.
в конечном счете, мне нужно рассчитать средние значения нескольких длительностей времени. У меня есть ... разница во времени для работы, и я храню их в списке. Теперь мне нужно рассчитать среднее значение. Я использую регулярные выражения для разбора исходного времени, а затем делаю различия.
для усреднения, я должен конвертировать в секундах, а затем в среднем?
10 ответов:
Да, конечно
datetime
это то, что вам нужно здесь. В частности,strptime
функция, которая анализирует строку в объект времени.from datetime import datetime s1 = '10:33:26' s2 = '11:15:49' # for example FMT = '%H:%M:%S' tdelta = datetime.strptime(s2, FMT) - datetime.strptime(s1, FMT)
, что значит
timedelta
объект, который содержит разницу между двумя временами. Вы можете делать все, что хотите, например, конвертировать его в секунды или добавить его в другойdatetime
.это вернет отрицательный результат, если время окончания меньше времени начала, например
s1 = 12:00:00
иs2 = 05:00:00
. Если вы хотите, чтобы код предполагал, что интервал пересекает полночь в этом случае (т. е. он должен предполагать, что время окончания никогда не раньше времени начала), вы можете добавить следующие строки в приведенный выше код:if tdelta.days < 0: tdelta = timedelta(days=0, seconds=tdelta.seconds, microseconds=tdelta.microseconds)
(конечно, вы должны включить
from datetime import timedelta
где-то). Спасибо J. F. Sebastian за указание на этот случай использования.
попробуйте это -- это эффективно для синхронизации краткосрочных событий. Если что-то занимает больше часа, то окончательный дисплей, вероятно, потребует некоторого дружественного форматирования.
import time start = time.time() time.sleep(10) # or do something more productive done = time.time() elapsed = done - start print(elapsed)
вот решение, которое поддерживает поиск разницы, даже если время окончания меньше времени начала (более полуночного интервала), например
23:55:00-00:25:00
(полчаса продолжительность):#!/usr/bin/env python from datetime import datetime, time as datetime_time, timedelta def time_diff(start, end): if isinstance(start, datetime_time): # convert to datetime assert isinstance(end, datetime_time) start, end = [datetime.combine(datetime.min, t) for t in [start, end]] if start <= end: # e.g., 10:33:26-11:15:49 return end - start else: # end < start e.g., 23:55:00-00:25:00 end += timedelta(1) # +day assert end > start return end - start for time_range in ['10:33:26-11:15:49', '23:55:00-00:25:00']: s, e = [datetime.strptime(t, '%H:%M:%S') for t in time_range.split('-')] print(time_diff(s, e)) assert time_diff(s, e) == time_diff(s.time(), e.time())
выход
0:42:23 0:30:00
time_diff()
возвращает объект timedelta, который можно передать (как часть последовательности) в
структура, которая представляет разницу во времени в Python называется timedelta. Если у вас есть
start_time
иend_time
какdatetime
типы вы можете рассчитать разницу с помощью-
оператор как:diff = end_time - start_time
вы должны сделать это перед преобразованием в формат строки particualr (например. прежде чем значение start_time.strftime(...)). Если у вас уже есть строковое представление, вам нужно преобразовать его обратно в time / datetime с помощью strptime метод.
этой сайт говорит попробовать:
import datetime as dt start="09:35:23" end="10:23:00" start_dt = dt.datetime.strptime(start, '%H:%M:%S') end_dt = dt.datetime.strptime(end, '%H:%M:%S') diff = (end_dt - start_dt) diff.seconds/60
этот форум использует время.mktime ()
мне нравится, как этот парень это делает - https://amalgjose.com/2015/02/19/python-code-for-calculating-the-difference-between-two-time-stamps. Не уверен, что у него есть какие-то минусы.
но выглядит хорошо для меня :)
from datetime import datetime from dateutil.relativedelta import relativedelta t_a = datetime.now() t_b = datetime.now() def diff(t_a, t_b): t_diff = relativedelta(t_b, t_a) # later/end time comes first! return '{h}h {m}m {s}s'.format(h=t_diff.hours, m=t_diff.minutes, s=t_diff.seconds)
Что касается вопроса, который вам все еще нужно использовать
datetime.strptime()
как говорили другие ранее.
и
time
иdatetime
есть компонент даты.обычно, если вы просто имеете дело с частью времени, вы бы предоставили дату по умолчанию. Если вы просто заинтересованы в разнице И знаете, что оба раза в один и тот же день, то построить
datetime
для каждого с днем, установленным на сегодня, и вычесть начало из времени остановки, чтобы получить интервал (timedelta
).
взгляните на модуль datetime и объекты timedelta. Вы должны в конечном итоге построить объект datetime для времени начала и остановки, и когда вы вычитаете их, вы получите timedelta.
попробуй такое
import datetime import time start_time = datetime.datetime.now().time().strftime('%H:%M:%S') time.sleep(5) end_time = datetime.datetime.now().time().strftime('%H:%M:%S') total_time=(datetime.datetime.strptime(end_time,'%H:%M:%S') - datetime.datetime.strptime(start_time,'%H:%M:%S')) print total_time
выход :
0:00:05
Краткий, если вы просто заинтересованы в прошедшем времени, которое составляет менее 24 часов. Вы можете отформатировать вывод по мере необходимости в инструкции return:
import datetime def elapsed_interval(start,end): elapsed = end - start min,secs=divmod(elapsed.days * 86400 + elapsed.seconds, 60) hour, minutes = divmod(min, 60) return '%.2d:%.2d:%.2d' % (hour,minutes,secs) if __name__ == '__main__': time_start=datetime.datetime.now() """ do your process """ time_end=datetime.datetime.now() total_time=elapsed_interval(time_start,time_end)