En este post de programación en Python y trabajo con fechas te enseñaré a sacar la diferencia que hay entre 2 fechas y luego convertir esa diferencia a segundos, minutos, horas, días, etcétera.
Con las operaciones y funciones que te mostraré serás capaz de calcular cualquier diferencia que hay entre 2 fechas incluso con segundos usando Python.
Gracias a esto podrías saber cuánto falta para determinada fecha, cuántos segundos restan hasta alcanzar una hora, o el tiempo transcurrido entre dos fechas, por ejemplo, cuántos días han pasado desde cierto evento, etcétera.
Vamos a trabajar con Python y el módulo datetime
que dentro tiene a datetime
y timedelta
.
Las fechas
Vamos a trabajar con 2 fechas y sacar la diferencia entre ellas, pero antes de proceder a ello quiero dejar algo claro: podemos declarar las fechas o podemos solicitarlas al usuario.
En el primer caso podemos obtener la fecha actual con datetime.datetime.now()
, pero para el segundo caso es distinto ya que la fecha puede venir del usuario, de una base de datos, etcétera.
Si quieres trabajar con fechas definidas desde el código usa las funciones de datetime.datetime
y timedelta
como explico en este post de sumar y restar fechas en Python.
Y en caso de que quieras parsear la fecha desde una cadena, usa strptime
. Por ejemplo, la de la línea 3:
from datetime import datetime, timedelta
ahora = datetime.now()
fin_anio_2021 = datetime.strptime("2021-12-31", "%Y-%m-%d")
Nota: en los ejemplos voy a mostrar la diferencia en segundos totales, pero al final también te mostraré a convertir los segundos a minutos, horas, años, días, etcétera.
Diferencia entre 2 fechas según cadena
Para este primer ejemplo veamos cómo obtener la diferencia entre dos fechas que son proporcionadas según una cadena.
from datetime import datetime
navidad = datetime.strptime("2021-12-25", "%Y-%m-%d")
fin_anio = datetime.strptime("2021-12-31", "%Y-%m-%d")
diferencia = fin_anio-navidad
print(f"La diferencia es de {diferencia.days} días y {diferencia.seconds} segundos. La diferencia total es de {diferencia.total_seconds()} segundos")
La salida para este caso es:
La diferencia es de 6 días y 0 segundos. La diferencia total es de 518400.0 segundos
Lo que yo sugiero es que siempre obtengas el total de segundos a través de total_seconds
y a partir de ahí hagas las conversiones, ya que el resultado de tipo timedelta
es un poco confuso al inicio.
Por cierto, como puedes ver todo es correcto, ya que hay exactamente 6 días de diferencia entre esas dos fechas.
El objeto de tipo timedelta en Python
Podemos obtener varios datos de la diferencia de fechas, o mejor dicho, obtener la diferencia de fechas expresado de distintas maneras.
Yo sigo recomendado obtenerlo a partir de total_seconds
pero también podemos acceder a days
, seconds
y microseconds
. Solo que no son valores separados, sino que la suma de los mismos nos dará la verdadera diferencia.
Por ejemplo, si la diferencia es de 2 días y 10 minutos, days
estará en 2 y seconds
en 120
. Es decir, los valores days
, seconds
y microseconds
se suman. Entonces es mejor usar total_seconds
si quieres una diferencia precisa.
Diferencia entre dos timedelta
Ahora veamos el otro ejemplo, en donde sumamos y restamos fechas para tener una fecha del futuro y poder indicar la diferencia.
from datetime import datetime, timedelta
ahora = datetime.now()
dentro_de_50_horas = ahora + timedelta(hours=50)
diferencia = (dentro_de_50_horas-ahora)
print(diferencia.total_seconds())
La salida será: 180000.0 y eso es correcto, ya que son los segundos transcurridos que se convertirán a 50 horas.
Convirtiendo segundos a días, horas, minutos y segundos
Como viste en los ejemplos anteriores estamos obteniendo los segundos totales, pero ahora te mostraré cómo convertirlos a algo legible o mejor dicho a extraer los valores (como en el ejemplo de convertir segundos a horas, minutos y segundos).
Aquí la función:
def obtener_tiempo_transcurrido(segundos):
dias = int(segundos / 60 / 60 / 24)
segundos -= dias * 60 * 60 * 24
horas = int(segundos / 60 / 60)
segundos -= horas*60*60
minutos = int(segundos/60)
segundos -= minutos*60
return f"{dias} días, {horas} horas, {minutos} minutos y {segundos} segundos"
En este caso estoy considerando hasta los días, pero incluso podrías sacar los años y todo eso. Por cierto, estoy regresando los valores en una oración como cadena, pero puedes regresarlos como una tupla, arreglo, etcétera. Al final queda en ti.
Poniendo todo junto
El código de ejemplo que saca la diferencia entre dos fechas con Python y muestra el tiempo legible queda así:
# https://parzibyte.me/blog
from datetime import datetime, timedelta
def obtener_tiempo_transcurrido(segundos):
dias = int(segundos / 60 / 60 / 24)
segundos -= dias * 60 * 60 * 24
horas = int(segundos / 60 / 60)
segundos -= horas*60*60
minutos = int(segundos/60)
segundos -= minutos*60
return f"{dias} días, {horas} horas, {minutos} minutos y {segundos} segundos"
ahora = datetime.now()
futuro = ahora + timedelta(hours=50, seconds=925)
diferencia = futuro-ahora
legible = obtener_tiempo_transcurrido(diferencia.total_seconds())
print(legible)
El ejemplo va a funcionar con fechas proporcionadas como cadena y con fechas de resultado de timedelta. Finalmente te dejo con más tutoriales de Python.
Gracias por compartir
OMG JAJAJA muchas gracias, creeme que estaba haciendo todo lo que la hace esta funcion desde 0 y no estaba teniendo exito, saludos.