¿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
¿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
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
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 –
@ Sam S ver mi respuesta a continuación se maneja el caso que usted se refiere. –
Uso datetime.strptime()
para analizar en instancias de fecha y hora, y luego calcular la diferencia, y finalmente convertir la diferencia en minutos.
Como estaba un poco ya se ha dicho, es necesario utilizar datetime.datetime's
strptime
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
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
Gran respuesta @ken :) –
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
'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
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
Este método no es correcto, ignora la diferencia en días. – Moberg
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
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
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.
Después de leer su respuesta, entendí su punto. ¡Bonito! – moooeeeep
minutes_diff = (datetime_end - datetime_start).total_seconds()/60.0
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
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
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. –