2010-05-07 18 views
35

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

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

no estoy seguro si es posible, pero debe cambiar su respuesta aceptada ya que el que has elegido no funciona en todos los casos, y puede causar problemas de la gente. –

Respuesta

-4
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 
+8

Esto no convierte el que a diferencia de minutos, por ejemplo, con los siguientes datetimes: datetime(2005, 7, 14, 18, 30) - datetime(2005, 7, 14, 15, 30) se acaba de dar vuelta 0 –

+2

@ Sam S ver mi respuesta a continuación se maneja el caso que usted se refiere. –

6

Uso datetime.strptime() para analizar en instancias de fecha y hora, y luego calcular la diferencia, y finalmente convertir la diferencia en minutos.

0

Como estaba un poco ya se ha dicho, es necesario utilizar datetime.datetime'sstrptime método:

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 
61

RSabet's answer no funciona en los casos en que las fechas no tienen exactamente el mismo tiempo.

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 le da una datetime.timedelta y cuando se utiliza días sólo 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 todavía devuelve 2 por días; ignora la hora, el minuto y el segundo desde el 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 hacerlo es convertirlos a 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 
+0

Gran respuesta @ken :) –

+0

Esto no funciona para mí, tengo dos valores que normalmente están separados por 50-100 segundos, pero cuando los uso, devuelve un valor en el rango de -17K a -18K. alguna idea de por qué esto puede ser? (Estoy usando el código exactamente como está escrito, excepto que las fechas dadas son diferentes). – thnkwthprtls

+0

'time.mktime()' puede tener en cuenta los cambios en el desplazamiento de utc local en algunas plataformas (también puede fallar si la entrada es una hora local ambigua, como durante una transición de fin de DST). Para obtener resultados consistentes en todas las plataformas, puede usar las zonas horarias 'pytz' (como las que devuelve la llamada' tzlocal.get_localzone() ') para conocer los objetos datetime: para obtener el tiempo transcurrido correcto (ignorando los segundos intercalares). – jfs

3

Para calcular con una fecha de tiempo 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 
+5

Este método no es correcto, ignora la diferencia en días. – Moberg

15

En caso de que alguien no se da cuenta, una manera de hacer esto sería combinar Christophe y RSabet de respuestas:

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 
+0

este método falla si el utc correspondiente a 'd1' es diferente del de' d2'. Para tener en cuenta la compensación utc, consulte la solución en [@Ken Cochrane y mi comentario allí] (http://stackoverflow.com/a/6879077/4279) – jfs

2

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

El caso más sencillo si ambas fechas utilizan el mismo desfase 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 soporta td // timedelta; reemplácelo por int(td.total_seconds() // 60).

Si el tiempo de entrada se encuentra en la zona horaria local que puede tener diferentes compensado en diferentes momentos por ejemplo UTC, que tiene el ahorro de tiempo, entonces usted debe hacer dt1, dt2 en objetos de fecha y hora conscientes antes de encontrar la diferencia de la luz del día, para tener en cuenta la posibles cambios en el desplazamiento utc.

La forma portátil para hacer una consciente objetos de fecha y hora locales es utilizar pytz zonas horarias:

#!/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 bien dt1 o dt2 corresponden a un tiempo ambiguo, entonces el defecto is_dst=False se utiliza para eliminar la ambigüedad. Puede establecer is_dst=None para generar una excepción para las horas locales ambiguas o inexistentes en su lugar.

Si no puede instalar módulos de terceros, entonces time.mktime() could be used from @Ken Cochrane's answer que pueden encontrar el desplazamiento utc correcto en algunas plataformas para algunas fechas en algunas zonas horarias - si no necesita un resultado coherente (pero tal vez incorrecto), entonces es mucho mejor que hacer dt2 - dt1 con objetos navideños de fecha y hora que siempre fallan si los desplazamientos utc correspondientes son diferentes.

+0

Después de leer su respuesta, entendí su punto. ¡Bonito! – moooeeeep

29
minutes_diff = (datetime_end - datetime_start).total_seconds()/60.0 
+1

Respuesta genial y simple; Agregaría la advertencia de que esto supone que 'datetime_end' y' datetime_start' ya están analizados en objetos 'datetime'. La substracción produce una instancia 'timedelta'. – oarevalo

0

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

Cuestiones relacionadas