Pregunta 1¿Qué combinación calcula "3 días desde ahora"?
datetime y time — Trabajar con fechas, horas y tiempo transcurrido
Aprende los módulos datetime / time / calendar de Python desde cero. Cubre la aritmética de fechas con date / datetime / timedelta, la conversión de cadenas vía strftime / strptime y la medición de tiempo transcurrido con time.perf_counter — todo práctico.
Este artículo recorre las tres bibliotecas estándar que manejan fechas, horas y tiempo transcurrido — datetime / time / calendar. Verás aritmética de fechas con date / datetime / timedelta, conversión bidireccional de cadenas con strftime / strptime y medición de tiempo transcurrido con time.perf_counter.
date / datetime / timedelta — Crear fechas y calcular diferencias
Cuando trabajas con fechas en Python, eliges entre tres clases del módulo datetime. date guarda solo año/mes/día, datetime añade hora/minuto/segundo, y timedelta representa una duración como "3 días" o "2 horas". El diseño es simétrico: date + timedelta te da "3 días desde ahora", y date - date devuelve el hueco entre dos fechas como un timedelta.
| Clase | Qué guarda | Uso típico |
|---|---|---|
| date | año / mes / día | Cumpleaños, fechas de pedido — todo donde solo importa la fecha |
| datetime | año / mes / día + hora / minuto / segundo | Logs, tiempos de modificación de archivos — todo donde la hora también importa |
| timedelta | días / segundos / microsegundos | "3 días desde ahora", "tiempo transcurrido" — duraciones |
| time | hora / minuto / segundo (sin fecha) | Solo hora del día, p. ej. "horario laboral 9:00 a 18:00" |
date2 - date1 devuelve un timedelta.from datetime import date, datetime, timedelta
# Crear una fecha
order_date = date(2024, 3, 15)
print(order_date) # 2024-03-15
# Tres días después
delivery = order_date + timedelta(days=3)
print(delivery) # 2024-03-18
# El hueco entre dos fechas es un timedelta
elapsed = delivery - order_date
print(elapsed.days) # 3
# Hora actual
now = datetime.now()
print(now.year, now.month, now.day)
datetime.now y dependencia del entorno
datetime.now() devuelve la hora actual de la máquina que ejecuta el código, así que el valor cambia en cada ejecución ya estés en el runtime Pyodide del navegador o en una máquina real. Las prácticas usan un date(2024, 3, 15) fijo para mantener la reproducibilidad — prueba now() por separado en la consola para ver cómo se comporta.
Calcular el hueco entre dos fechas
Restar una fecha de otra devuelve un objeto timedelta. El atributo .days te da solo el conteo de días, así que preguntas como "¿cuántos días hasta X?" tienen una respuesta entera limpia.
strftime / strptime — Convertir entre fechas y cadenas
Las fechas dentro de archivos, logs o JSON casi siempre llegan como cadenas. En Python, strftime (format time) convierte datetime → cadena, y strptime (parse time) convierte cadena → datetime. Ambas toman un código de formato que mapea símbolos a significados — %Y es un año de 4 dígitos, %m es un mes de 2 dígitos, etc.
f es de format, la p es de parse. Los códigos de formato (%Y, %m, %d, etc.) se comparten entre los dos.| Código de formato | Significado | Ejemplo |
|---|---|---|
| %Y | Año de 4 dígitos | 2024 |
| %m | Mes de 2 dígitos (01-12) | 03 |
| %d | Día de 2 dígitos (01-31) | 15 |
| %H | Hora de 2 dígitos en 24h (00-23) | 14 |
| %M | Minuto de 2 dígitos (00-59) | 30 |
| %S | Segundo de 2 dígitos (00-59) | 00 |
| %A | Nombre del día (inglés) | Friday |
| %w | Número del día (0=Dom, 6=Sáb) | 5 |
from datetime import datetime
# cadena -> datetime
text = "2024-03-15 14:30:00"
dt = datetime.strptime(text, "%Y-%m-%d %H:%M:%S")
print(dt.year, dt.month, dt.day) # 2024 3 15
# datetime -> cadena
dt2 = datetime(2024, 3, 15, 14, 30)
print(dt2.strftime("%Y/%m/%d")) # 2024/03/15
print(dt2.strftime("%Y-%m-%d %H:%M")) # 2024-03-15 14:30
Las desigualdades de formato lanzan ValueError
Si los separadores en tu cadena no coinciden con el código de formato — por ejemplo strptime("2024/03/15", "%Y-%m-%d") — obtienes un ValueError. Mira el formato real de tus datos de entrada y alinea guiones con guiones, barras con barras. Para cadenas estilo ISO como "2024-03-15T14:30:00" que mezclan guiones con una T y dos puntos, datetime.fromisoformat(text) es más fácil.
time y calendar — Medir tiempo transcurrido e inspeccionar meses
El módulo time está separado de datetime y expone APIs de tiempo de más bajo nivel. La que más usarás es time.perf_counter(), un contador de alta resolución que devuelve el tiempo transcurrido actual en segundos (como float). Llámalo dos veces — antes y después — y la diferencia es tu tiempo de ejecución. El módulo calendar saca información de calendario como cuántos días tiene un mes o el día de la semana del primero del mes.
| Función | Devuelve | Caso de uso |
|---|---|---|
| time.time() | timestamp Unix (float) | Timestamps de hora actual |
| time.perf_counter() | contador monotónico (float, segundos) | Medir tiempo de ejecución |
| calendar.monthrange(y, m) | tupla (día de semana del primero, último día) | Información de calendario del mes |
| calendar.isleap(y) | True / False | Comprobación de año bisiesto |
import time
import calendar
# Medir tiempo de ejecución
start = time.perf_counter()
total = sum(range(100000))
elapsed = time.perf_counter() - start
print("Total:", total)
print("Tipo:", type(elapsed).__name__) # float
# Información de calendario
weekday, last_day = calendar.monthrange(2024, 2) # (día de semana del primero, último día)
print("Último día de feb 2024:", last_day)
print("Año bisiesto:", calendar.isleap(2024))
Por qué usar perf_counter en lugar de time.time
time.time() devuelve un timestamp Unix (segundos con fracción), pero si el reloj de la máquina se ajusta hacia atrás por NTP, la diferencia puede salir negativa. time.perf_counter() está garantizado como monotónico (siempre creciente) y está construido a propósito para medir tiempo transcurrido, así que para cronometrar tipo cronómetro es la elección correcta siempre.
time.sleep — Pausar durante un intervalo fijado
`time.sleep(segundos)` es una función que pausa la ejecución durante el número dado de segundos. Aparece en todas partes — intervalos de reintento, limitación de tasa, sincronización de animaciones. El argumento es un float, así que puedes pasar fracciones como time.sleep(0.5). Como estos ejercicios se ejecutan en el navegador, mantén las pausas cortas (0–1 segundo) para verificar el comportamiento.
Verificación de conocimientos
Responde cada pregunta una a una.
Pregunta 2¿Qué cadena de formato convierte la cadena "2024/03/15" en un datetime?
Pregunta 3¿Cuál es la mejor opción para medir tiempo de ejecución?
Pregunta 4¿Cuál es la forma más simple de convertir la cadena ISO 8601 "2024-03-15T14:30:00" en un datetime?