python

Python – Diferencia entre fechas

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

Diferencia entre fechas con Python

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.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

32 min hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

6 días hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

6 días hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

6 días hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

6 días hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

6 días hace

Esta web usa cookies.