Aprende leyendo en orden

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 transcurridodatetime / 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.

Cómo se relacionan date / datetime / timedelta
dateaño / mes / díadatetimeaño / mes / día + horatimedeltaduración (hueco / desplazamiento)
date y datetime representan puntos en el tiempo; timedelta representa el hueco entre ellos o una cantidad a sumar.
ClaseQué guardaUso típico
dateaño / mes / díaCumpleaños, fechas de pedido — todo donde solo importa la fecha
datetimeaño / mes / día + hora / minuto / segundoLogs, tiempos de modificación de archivos — todo donde la hora también importa
timedeltadías / segundos / microsegundos"3 días desde ahora", "tiempo transcurrido" — duraciones
timehora / minuto / segundo (sin fecha)Solo hora del día, p. ej. "horario laboral 9:00 a 18:00"
Aritmética de fechas con la biblioteca datetime
date(2024, 3, 15)crear+ timedelta(days=3)date(2024, 3, 18)resultado+ timedelta= nueva fecha
date + timedelta te da una nueva fecha. La diferencia 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.

Calcula la fecha de envío (3 días después) y la fecha de vencimiento del pago (14 días después) a partir de la fecha de pedido 2024-03-15.

① Importa date y timedelta de datetime y luego construye la fecha de pedido date(2024, 3, 15).

② Calcula fecha de envío = fecha de pedido + timedelta(days=3) y vencimiento de pago = fecha de pedido + timedelta(days=14).

③ Imprime ambas como Envío: ... y Vencimiento: ....

Editor Python

Ejecutar el código para ver el resultado

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.

Calcula cuántos días separan la fecha de envío y el vencimiento del pago de la Práctica 1.

① Recrea la misma fecha de pedido, fecha de envío y vencimiento que en la Práctica 1.

② Calcula pay_due - ship_date para obtener un timedelta y luego lee su atributo .days.

③ Imprime el conteo de días como Intervalo: ... días.

Editor Python

Ejecutar el código para ver el resultado

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.

La simetría de strftime y strptime
objetodatetimecadena'2024-03-15'códigos como %Y-%m-%dobjetodatetimecadena'2024-03-15'strftime (format)strptime (parse)
strftime escribe un datetime usando una cadena de formato; strptime lee una cadena de vuelta con el mismo formato. La 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 formatoSignificadoEjemplo
%YAño de 4 dígitos2024
%mMes de 2 dígitos (01-12)03
%dDía de 2 dígitos (01-31)15
%HHora de 2 dígitos en 24h (00-23)14
%MMinuto de 2 dígitos (00-59)30
%SSegundo de 2 dígitos (00-59)00
%ANombre del día (inglés)Friday
%wNú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.

Convierte la cadena de timestamp de log "2024-03-15 14:30:45" en un objeto datetime y luego reformatéala de otra forma.

① Importa la clase datetime del módulo datetime.

② Guarda la cadena de timestamp anterior en una variable.

Parsea la cadena en un objeto datetime (el código de formato refleja la disposición de la entrada). Luego imprime Tipo: datetime usando type(value).__name__.

④ Saca año, mes y día del datetime como atributos (d.year / d.month / d.day) e imprímelos como Año: ... Mes: ... Día: ....

⑤ Formatea el mismo datetime en año/mes/día hora:minuto (omite los segundos). Imprime el tipo del valor formateado como Tipo formateado: str con type(formatted).__name__, luego imprime el valor como Formateado: ... (confirmando que pasó datetime → str).

Editor Python

Ejecutar el código para ver el resultado

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.

Cuándo usar time.time vs time.perf_counter
time.time()timestamp Unix (segundos)time.perf_counter()contador monotónicotimestamps de logcuando importael tiempo absolutomedir ejecucióncuando basta el tiempo relativo
time.time devuelve segundos desde 1970-01-01 00:00 UTC (un timestamp Unix). time.perf_counter es un contador monotónico de alta precisión con un cero no especificado — perfecto para medir tiempo transcurrido.
FunciónDevuelveCaso 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 / FalseComprobació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.

Combina la medición de tiempo transcurrido con información de mes.

① Importa time y calendar.

② Inicia un cronómetro (usa el contador de alta precisión para tiempo transcurrido).

③ Suma los enteros de 0 a 49999.

④ Calcula el tiempo transcurrido e imprime Total: ... y Transcurrido >= 0 segundos: True (el tiempo real varía según el entorno, así que solo confirmamos que es no negativo).

⑤ Imprime el último día de febrero 2024 como Fin de feb: ... días y la comprobación de año bisiesto como Año bisiesto: True / False.

Editor Python

Ejecutar el código para ver el resultado

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.

Detén la ejecución con `time.sleep` y comprueba si el tiempo transcurrido es de al menos 0,3 segundos. El tiempo real fluctúa un poco según el entorno, así que lo verificamos como booleano — ¿fueron al menos 0,3 segundos?

① Importa time.

② Registra el tiempo de inicio con time.perf_counter().

③ Espera 0,3 segundos con time.sleep(0.3).

④ Calcula el tiempo transcurrido como time.perf_counter() - start_time e imprime Transcurrido >= 0,2 segundos: True / False usando >= 0.2.

(Si lo ejecutas correctamente la explicación aparece abajo.)

Editor Python

Ejecutar el código para ver el resultado
QUIZ

Verificación de conocimientos

Responde cada pregunta una a una.

Pregunta 1¿Qué combinación calcula "3 días desde ahora"?

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?