python

Sumar y restar fechas en Python

Hace tiempo publiqué cómo operar con fechas en Java, y cómo sumar y restar fechas con JavaScript. Hoy me tocó trabajar con Python y vengo a compartir lo que aprendí: sumar y restar fechas.

Por ejemplo, veremos cómo sumarle días a una fecha, así como restarle. Y no solo días, también años, meses, etcétera.

Obteniendo la fecha

Necesitamos un objeto de tipo fecha, y no una cadena. Por lo tanto, antes de que puedas operar fechas necesitas obtener la fecha.

Si quisieras obtener la fecha actual podrías hacerlo con:

ahora = datetime.now()

Y si quieres que sea introducida por el usuario, o a partir de una cadena, utiliza algo como lo siguiente:

fechaCadena = "2020-04-22"
ahora = datetime.strptime(fechaCadena, '%Y-%m-%d')

Solo recuerda validar la fecha.

Sumar y restar fechas en Python con timedelta

Una vez que tengas la fecha puedes sumar y restar con la siguiente sintaxis:

fecha_resultado = fecha - timedelta(argumentos...)

Usamos el operador + y el operador - para operar con la fecha y con lo que devuelva timedelta. A timedelta le puedes pasar por ejemplo los días o las horas.

Veamos un ejemplo que resta 7 días a la fecha actual:

from datetime import datetime
from datetime import timedelta

ahora = datetime.now()
print("Ahora: " + str(ahora))
hace_una_semana = ahora - timedelta(days=7)
print("Hace una semana: " + str(hace_una_semana))

Al ejecutarlo, la salida es:

Ahora: 2020-04-23 16:05:16.015948
Hace una semana: 2020-04-16 16:05:16.015948

También puedes formatear la fecha en caso de que solo necesites, por ejemplo, la fecha sin hora:

# Recuerda que puedes formatearla.
hace_una_semana_formateada = hace_una_semana.strftime("%Y-%m-%d")
print("Hace una semana, solo fecha: " + hace_una_semana_formateada)

Operar fechas introducidas por usuario

Como te decía anteriormente, puedes escanear la fecha y luego parsearla. Veamos un ejemplo simple que parsea una fecha con hora, y le suma una hora usando timedelta:

from datetime import datetime
from datetime import timedelta
# Ahora sumar algunas horas. Vamos a parsear la fecha:
fechaCadena = "2020-04-22 00:00:00"
ahora = datetime.strptime(fechaCadena, '%Y-%m-%d %H:%M:%S')
print("Ahora: " + str(ahora))
dentro_de_1_hora = ahora + timedelta(hours=1)
print("Dentro de una hora: " + str(dentro_de_1_hora))

De este modo la fecha como cadena podría venir de una base de datos, del teclado, etcétera.

Usando dateutil.relativedelta

Hasta ahora hemos operado con horas y con días, pero falta operar con meses o semanas. Lo anteriormente explicado solo cubre horas, días y otros, pero no meses (tomando en cuenta años bisiestos y todo eso)

Afortunadamente existe un paquete que podemos instalar con pip:

pip install python-dateutil

Y a partir del mismo ya podemos usar dateutil.relativedelta. Lo importante aquí es saber que siempre vamos a sumar, pero que si queremos restar, debemos indicar los parámetros en negativo.

Veamos los ejemplos:

"""
Comienza el uso de relativedelta. Recuerda instalar con:
pip install python-dateutil
"""

dentro_de_un_mes = ahora + relativedelta(months=1)
print("Dentro de un mes: " + str(dentro_de_un_mes))


dentro_de_anio_y_semana = ahora + relativedelta(years=1, weeks=1)
print("Dentro de un año y una semana: " + str(dentro_de_anio_y_semana))

# Sumar pero con negativos, obteniendo una resta

hace_dos_anios = ahora + relativedelta(years=-2)
print("Hace dos años: " + str(hace_dos_anios))

En la línea 15 puedes ver que estoy haciendo una resta pues estoy especificando los años en -2; así que aunque sume, en realidad estoy restando.

Puedes ver la documentación de relativedelta.

Poniendo todo junto

El ejemplo completo (que usa timedelta y relativedelta) queda así:

"""
  ____          _____               _ _           _       
 |  _ \        |  __ \             (_) |         | |      
 | |_) |_   _  | |__) |_ _ _ __ _____| |__  _   _| |_ ___ 
 |  _ <| | | | |  ___/ _` | '__|_  / | '_ \| | | | __/ _ \
 | |_) | |_| | | |  | (_| | |   / /| | |_) | |_| | ||  __/
 |____/ \__, | |_|   \__,_|_|  /___|_|_.__/ \__, |\__\___|
         __/ |                               __/ |        
        |___/                               |___/         
    
    Blog:       https://parzibyte.me/blog
    Ayuda:      https://parzibyte.me/blog/contrataciones-ayuda/
    Contacto:   https://parzibyte.me/blog/contacto/
    
    Copyright (c) 2020 Luis Cabrera Benito
    Licenciado bajo la licencia MIT
    
    El texto de arriba debe ser incluido en cualquier redistribución
"""
from datetime import datetime
from datetime import timedelta
from dateutil.relativedelta import relativedelta

# La fecha puede venir de now, o puedes parsearla como veremos más abajo
ahora = datetime.now()
print("Ahora: " + str(ahora))
hace_una_semana = ahora - timedelta(days=7)
print("Hace una semana: " + str(hace_una_semana))
# Recuerda que puedes formatearla.
hace_una_semana_formateada = hace_una_semana.strftime("%Y-%m-%d")
print("Hace una semana, solo fecha: " + hace_una_semana_formateada)

# Ahora sumar algunas horas. Vamos a parsear la fecha:
fechaCadena = "2020-04-22 00:00:00"
ahora = datetime.strptime(fechaCadena, '%Y-%m-%d %H:%M:%S')
print("Ahora: " + str(ahora))
dentro_de_1_hora = ahora + timedelta(hours=1)
print("Dentro de una hora: " + str(dentro_de_1_hora))

"""
Comienza el uso de relativedelta. Recuerda instalar con:
pip install python-dateutil
"""

dentro_de_un_mes = ahora + relativedelta(months=1)
print("Dentro de un mes: " + str(dentro_de_un_mes))


dentro_de_anio_y_semana = ahora + relativedelta(years=1, weeks=1)
print("Dentro de un año y una semana: " + str(dentro_de_anio_y_semana))

# Sumar pero con negativos, obteniendo una resta

hace_dos_anios = ahora + relativedelta(years=-2)
print("Hace dos años: " + str(hace_dos_anios))

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…

1 semana 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…

2 semanas 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…

2 semanas 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…

2 semanas hace

Errores de Comlink y algunas soluciones

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

2 semanas 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…

2 semanas hace

Esta web usa cookies.