Trabajo con fechas en datetime: guía completa Python

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

El módulo datetime en Python proporciona herramientas potentes para trabajar con fechas y horas. Esta biblioteca es esencial para crear informes, análisis, planificar eventos y procesar marcas de tiempo en cualquier proyecto de software.

Fundamentos del módulo datetime

Importación y clases principales

El módulo datetime forma parte de la biblioteca estándar de Python y no requiere instalación adicional:

import datetime
from datetime import date, time, datetime, timedelta, timezone

Clases principales del módulo:

  • datetime.date — trabaja con fechas (año, mes, día)
  • datetime.time — trabaja con horas (horas, minutos, segundos)
  • datetime.datetime — combina fecha y hora
  • datetime.timedelta — representa la diferencia entre fechas/horas
  • datetime.timezone — manejo de zonas horarias

Obtener la fecha y hora actual

from datetime import datetime, date

# Fecha y hora actual
now = datetime.now()
print(f"Fecha y hora actual: {now}")

# Solo la fecha actual
today = date.today()
print(f"Fecha de hoy: {today}")

Creación y manipulación de fechas

Crear fechas manualmente

from datetime import date, datetime

# Crear una fecha específica
custom_date = date(2025, 5, 9)
print(f"Fecha personalizada: {custom_date}")

# Crear fecha y hora
custom_datetime = datetime(2025, 5, 9, 14, 30, 45)
print(f"Fecha y hora personalizada: {custom_datetime}")

Extraer componentes de una fecha

today = date.today()
print(f"Año: {today.year}")
print(f"Mes: {today.month}")
print(f"Día: {today.day}")
print(f"Día de la semana: {today.weekday()}")  # 0 = lunes, 6 = domingo

Trabajo con horas

Crear y manipular objetos de tiempo

from datetime import time

# Crear una hora específica
custom_time = time(14, 30, 45)
print(f"Hora personalizada: {custom_time}")

# Extraer componentes de la hora
print(f"Horas: {custom_time.hour}")
print(f"Minutos: {custom_time.minute}")
print(f"Segundos: {custom_time.second}")

Obtener la hora con microsegundos

from datetime import datetime

now = datetime.now()
print(f"Hora con microsegundos: {now}")
print(f"Microsegundos: {now.microsecond}")

Operaciones aritméticas con fechas

Usar timedelta

from datetime import date, datetime, timedelta

# Operaciones con fechas
today = date.today()
tomorrow = today + timedelta(days=1)
last_week = today - timedelta(weeks=1)
next_month = today + timedelta(days=30)

print(f"Mañana: {tomorrow}")
print(f"Hace una semana: {last_week}")
print(f"En un mes: {next_month}")

# Operaciones más complejas
future_date = today + timedelta(days=100, hours=5, minutes=30)
print(f"En 100 días, 5 horas y 30 minutos: {future_date}")

Calcular la diferencia entre fechas

from datetime import date, datetime

start_date = date(2025, 1, 1)
end_date = date(2025, 12, 31)

# Diferencia en días
difference = end_date - start_date
print(f"Diferencia en días: {difference.days}")

# Diferencia en segundos para datetime
start_time = datetime(2025, 5, 9, 10, 0, 0)
end_time = datetime(2025, 5, 9, 15, 30, 45)

time_diff = end_time - start_time
print(f"Diferencia en segundos: {time_diff.total_seconds()}")
print(f"Diferencia en horas: {time_diff.total_seconds() / 3600}")

Formateo de fechas y horas

Método strftime

from datetime import datetime

now = datetime.now()

# Varios formatos
print(now.strftime("%d/%m/%Y"))  # 09/05/2025
print(now.strftime("%A, %d de %B de %Y"))  # viernes, 09 de mayo de 2025
print(now.strftime("%H:%M:%S"))  # 14:30:45
print(now.strftime("%I:%M %p"))  # 02:30 PM

Analizar cadenas de texto a fechas con strptime

from datetime import datetime

# Convertir texto a fecha
date_string = "09/05/2025"
parsed_date = datetime.strptime(date_string, "%d/%m/%Y")
print(f"Fecha analizada: {parsed_date}")

# Otro formato
date_string2 = "2025-05-09 14:30:45"
parsed_date2 = datetime.strptime(date_string2, "%Y-%m-%d %H:%M:%S")
print(f"Fecha analizada: {parsed_date2}")

Trabajo con zonas horarias

Usar timezone

from datetime import datetime, timezone, timedelta

# Zona horaria UTC
utc_time = datetime.now(timezone.utc)
print(f"Hora UTC: {utc_time}")

# Zona horaria personalizada (UTC+3)
tz_moscow = timezone(timedelta(hours=3))
moscow_time = datetime.now(tz_moscow)
print(f"Hora en Moscú (UTC+3): {moscow_time}")

# Zona horaria UTC-5 (hora de Nueva York)
tz_ny = timezone(timedelta(hours=-5))
ny_time = datetime.now(tz_ny)
print(f"Hora en Nueva York (UTC-5): {ny_time}")

Conversión entre zonas horarias

from datetime import datetime, timezone, timedelta

# Crear hora en UTC
utc_time = datetime(2025, 5, 9, 12, 0, 0, tzinfo=timezone.utc)
print(f"Hora UTC: {utc_time}")

# Convertir a UTC+3
tz_moscow = timezone(timedelta(hours=3))
moscow_time = utc_time.astimezone(tz_moscow)
print(f"Hora en Moscú: {moscow_time}")

# Convertir a UTC-5
tz_ny = timezone(timedelta(hours=-5))
ny_time = utc_time.astimezone(tz_ny)
print(f"Hora en Nueva York: {ny_time}")

Ejemplos prácticos

Calcular la edad

from datetime import date

def calcular_edad(fecha_nacimiento):
    today = date.today()
    edad = today.year - fecha_nacimiento.year
    
    # Ajustar si aún no ha cumplido años este año
    if (today.month, today.day) < (fecha_nacimiento.month, fecha_nacimiento.day):
        edad -= 1
    
    return edad

# Ejemplo
nacimiento = date(1990, 5, 15)
edad = calcular_edad(nacimiento)
print(f"Edad: {edad} años")

Verificar si una fecha es fin de semana

from datetime import date

def es_fin_de_semana(fecha):
    # weekday(): 0=lunes, 6=domingo
    return fecha.weekday() >= 5

# Ejemplo
today = date.today()
if es_fin_de_semana(today):
    print(f"{today} es fin de semana")
else:
    print(f"{today} es día laborable")

Generar un rango de fechas

from datetime import date, timedelta

def generar_rango_fechas(inicio, fin):
    fechas = []
    current = inicio
    while current <= fin:
        fechas.append(current)
        current += timedelta(days=1)
    return fechas

# Ejemplo: fechas de mayo 2025
inicio = date(2025, 5, 1)
fin = date(2025, 5, 15)
fechas_mayo = generar_rango_fechas(inicio, fin)
for fecha in fechas_mayo:
    print(fecha)

Consejos y buenas prácticas

  • Usa timezone.utc para evitar confusiones con zonas horarias
  • Almacena fechas en UTC en bases de datos y conviértelas solo al mostrar
  • Prefiere datetime sobre date cuando necesites precisión de tiempo
  • Usa timedelta para cálculos de fechas en lugar de sumar días manualmente
  • Valida fechas con try/except al usar strptime para evitar errores

Conclusión

El módulo datetime de Python es una herramienta indispensable para cualquier desarrollador. Con los conceptos y ejemplos de esta guía, podrás manejar fechas, horas y zonas horarias de manera eficiente en tus proyectos. Practica con los ejemplos y explora la documentación oficial para dominar completamente esta biblioteca.

Blogs

Book Recommendations