restar horas fechas python time python-2.6

python - horas - Cómo calcular el intervalo de tiempo entre dos cadenas de tiempo



fechas en python (9)

Aquí hay una solución que permite encontrar la diferencia incluso si la hora de finalización es inferior a la hora de inicio (más que el intervalo de medianoche), como 23:55:00-00:25:00 (media hora de duración):

#!/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())

Salida

0:42:23 0:30:00

time_diff() devuelve un objeto timedelta que puede pasar (como parte de la secuencia) a una función mean() directamente, por ejemplo:

#!/usr/bin/env python from datetime import timedelta def mean(data, start=timedelta(0)): """Find arithmetic average.""" return sum(data, start) / len(data) data = [timedelta(minutes=42, seconds=23), # 0:42:23 timedelta(minutes=30)] # 0:30:00 print(repr(mean(data))) # -> datetime.timedelta(0, 2171, 500000) # days, seconds, microseconds

El resultado mean() también es el objeto timedelta() que puede convertir a segundos (método td.total_seconds() (desde Python 2.7)), horas ( td / timedelta(hours=1) (Python 3)), etc.

Tengo dos tiempos, un inicio y una hora de finalización, en el formato de 10:33:26 (HH: MM: SS). Necesito la diferencia entre las dos veces. He estado buscando documentación en Python y buscando en línea y me imagino que tendría algo que ver con los módulos de fecha y hora. No puedo hacer que funcione correctamente y sigo buscando solo cómo hacerlo cuando se trata de una fecha.

En definitiva, necesito calcular los promedios de múltiples duraciones de tiempo. Tengo las diferencias de tiempo para trabajar y las estoy almacenando en una lista. Ahora necesito calcular el promedio. Estoy usando expresiones regulares para analizar los tiempos originales y luego hacer las diferencias.

Para el promedio, ¿debo convertir a segundos y luego promediar?


Eche un vistazo al módulo datetime y los objetos timedelta. Debería terminar construyendo un objeto datetime para las horas de inicio y finalización, y cuando las resta, obtiene un timedelta.


La estructura que representa la diferencia de tiempo en Python se llama timedelta . Si tiene start_time y end_time como tipos de datetime y datetime , puede calcular la diferencia mediante - operador como:

diff = end_time - start_time

debe hacer esto antes de convertir a un formato de cadena particular (por ejemplo, antes de start_time.strftime (...)). En caso de que ya tenga una representación de cadena, debe convertirla a hora / fecha y hora utilizando el método strptime .


Me gusta cómo lo hace este tipo: https://amalgjose.com/2015/02/19/python-code-for-calculating-the-difference-between-two-time-stamps . No estoy seguro si tiene algunos contras.

Pero se ve limpio para mí :)

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)

En cuanto a la pregunta, aún necesita usar datetime.strptime() como otros dijeron anteriormente.


Prueba esto

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

SALIDA:

0:00:05


Pruebe esto: es eficiente para cronometrar eventos a corto plazo. Si algo lleva más de una hora, entonces la pantalla final probablemente querrá un formato amigable.

import time start = time.time() time.sleep(10) # or do something more productive done = time.time() elapsed = done - start print(elapsed)


Tanto la time como la datetime y datetime tienen un componente de fecha.

Normalmente, si solo está tratando con la parte de tiempo, proporcionaría una fecha predeterminada. Si solo está interesado en la diferencia y sabe que ambas veces son el mismo día, construya una datetime para cada una con el día establecido hoy y reste el inicio de la hora de timedelta para obtener el intervalo ( timedelta ).


This sitio dice que intentes:

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

Este foro usa time.mktime ()


Sí, definitivamente datetime es lo que necesitas aquí. Específicamente, la función strptime , que analiza una cadena en un objeto de tiempo.

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)

Eso te da un objeto timedelta que contiene la diferencia entre las dos veces. Puede hacer lo que quiera con eso, por ejemplo, convertirlo a segundos o agregarlo a otra datetime y datetime .

Esto devolverá un resultado negativo si la hora de finalización es anterior a la hora de inicio, por ejemplo s1 = 12:00:00 y s2 = 05:00:00 . Si desea que el código suponga que el intervalo cruza la medianoche en este caso (es decir, debe asumir que la hora de finalización nunca es anterior a la hora de inicio), puede agregar las siguientes líneas al código anterior:

if tdelta.days < 0: tdelta = timedelta(days=0, seconds=tdelta.seconds, microseconds=tdelta.microseconds)

(por supuesto, debe incluir from datetime import timedelta algún lugar). Gracias a JF Sebastian por señalar este caso de uso.