Diferencia de fecha en minutos en Python

¿Cómo calculo la diferencia en tiempo en minutos para la siguiente marca de tiempo en Python?

2010-01-01 17:31:22 2010-01-03 17:31:22 

 from datetime import datetime fmt = '%Y-%m-%d %H:%M:%S' d1 = datetime.strptime('2010-01-01 17:31:22', fmt) d2 = datetime.strptime('2010-01-03 17:31:22', fmt) print (d2-d1).days * 24 * 60 

La respuesta de RSabet no funciona en los casos en que las fechas no tienen la misma hora exacta.

Problema original:

 from datetime import datetime fmt = '%Y-%m-%d %H:%M:%S' d1 = datetime.strptime('2010-01-01 17:31:22', fmt) d2 = datetime.strptime('2010-01-03 17:31:22', fmt) daysDiff = (d2-d1).days print daysDiff > 2 # Convert days to minutes minutesDiff = daysDiff * 24 * 60 print minutesDiff > 2880 

d2-d1 te da un datetime.timedelta y cuando usas días solo te mostrará los días en el timedelta. En este caso, funciona bien, pero si tuviera lo siguiente.

 from datetime import datetime fmt = '%Y-%m-%d %H:%M:%S' d1 = datetime.strptime('2010-01-01 16:31:22', fmt) d2 = datetime.strptime('2010-01-03 20:15:14', fmt) daysDiff = (d2-d1).days print daysDiff > 2 # Convert days to minutes minutesDiff = daysDiff * 24 * 60 print minutesDiff > 2880 # that is wrong 

Todavía le habría dado la misma respuesta ya que aún devuelve 2 por días; ignora la hora, el minuto y el segundo del timedelta.

Un mejor enfoque sería convertir las fechas a un formato común y luego hacer el cálculo. La forma más fácil de hacer esto es convertirlos a las marcas de tiempo Unix. Aquí está el código para hacer eso.

 from datetime import datetime import time fmt = '%Y-%m-%d %H:%M:%S' d1 = datetime.strptime('2010-01-01 17:31:22', fmt) d2 = datetime.strptime('2010-01-03 20:15:14', fmt) # Convert to Unix timestamp d1_ts = time.mktime(d1.timetuple()) d2_ts = time.mktime(d2.timetuple()) # They are now in seconds, subtract and then divide by 60 to get minutes. print int(d2_ts-d1_ts) / 60 > 3043 # Much better 
 minutes_diff = (datetime_end - datetime_start).total_seconds() / 60.0 

En caso de que alguien no se dé cuenta, una forma de hacerlo sería combinar las respuestas de Christophe y RSabet:

 from datetime import datetime import time fmt = '%Y-%m-%d %H:%M:%S' d1 = datetime.strptime('2010-01-01 17:31:22', fmt) d2 = datetime.strptime('2010-01-03 20:15:14', fmt) diff = d2 -d1 diff_minutes = (diff.days * 24 * 60) + (diff.seconds/60) print(diff_minutes) > 3043 

Use datetime.strptime() para analizar las instancias de datetime, luego calcule la diferencia y finalmente convierta la diferencia en minutos.

El resultado depende de la zona horaria que corresponde a las cadenas de tiempo de entrada.

El caso más simple si ambas fechas usan el mismo desplazamiento utc:

 #!/usr/bin/env python3 from datetime import datetime, timedelta time_format = "%Y-%d-%m %H:%M:%S" dt1 = datetime.strptime("2010-01-01 17:31:22", time_format) dt2 = datetime.strptime("2010-01-03 17:31:22", time_format) print((dt2 - dt1) // timedelta(minutes=1)) # minutes 

Si su versión de Python no es compatible con td // timedelta ; int(td.total_seconds() // 60) con int(td.total_seconds() // 60) .

Si la hora de entrada está en la zona horaria local que puede tener un desplazamiento utc diferente en diferentes momentos, por ejemplo, tiene horario de verano, debe hacer que dt1 , dt2 conviertan en objetos de fecha y hora antes de encontrar la diferencia, para tener en cuenta los posibles cambios en el desplazamiento de utc.

La forma portátil de hacer que los objetos locales de una fecha sean conscientes es usar pytz horarias de pytz :

 #!/usr/bin/env python from datetime import timedelta import tzlocal # $ pip install tzlocal local_tz = tzlocal.get_localzone() # get pytz timezone aware_dt1, aware_dt2 = map(local_tz.localize, [dt1, dt2]) td = aware_dt2 - aware_dt1 # elapsed time 

Si dt1 o dt2 corresponden a un tiempo ambiguo, entonces el valor predeterminado is_dst=False se usa para desambiguar. Podría establecer is_dst=None para generar una excepción para las horas locales ambiguas o inexistentes.

Si no puede instalar módulos de terceros, entonces se puede usar time.mktime() de la respuesta de @Ken Cochrane que puede encontrar la compensación de utc correcta en algunas plataformas para algunas fechas en algunas zonas horarias, si no necesita un sistema consistente ( pero tal vez incorrecto) el resultado es mucho mejor que hacer dt2 - dt1 con objetos de fecha y hora ingenuos que siempre fallan si las compensaciones de utc correspondientes son diferentes.

Para calcular con una fecha diferente:

 from datetime import datetime fmt = '%Y-%m-%d %H:%M:%S' d1 = datetime.strptime('2010-01-01 16:31:22', fmt) d2 = datetime.strptime('2010-01-03 20:15:14', fmt) diff = d2-d1 diff_minutes = diff.seconds/60 

Como ya se dijo, necesita usar datetime.datetime's método de strptime datetime.datetime's strptime datetime.datetime's :

 from datetime import datetime fmt = '%Y-%m-%d %H:%M:%S' d1 = datetime.strptime('2010-01-01 17:31:22', fmt) d2 = datetime.strptime('2010-01-03 17:31:22', fmt) daysDiff = (d2-d1).days # convert days to minutes minutesDiff = daysDiff * 24 * 60 print minutesDiff 

En otras formas de obtener la diferencia entre la fecha;

 import dateutil.parser import datetime timeDifference = current_date - dateutil.parser.parse(last_sent_date) time_difference_in_minutes = (int(timeDifference.days) * 24 * 60) + int((timeDifference.seconds) / 60) 

Gracias

También hay una manera furtiva con pandas:

pd.to_timedelta(x) - pd.to_timedelta(y)