Los dos tipos principales: date y datetime
El módulo datetime te da cuatro cosas que vale la pena conocer: date, time, datetime y timedelta. Los tres primeros son lo que suenan; el cuarto es un lapso de tiempo.
Un date representa un día — año, mes, día — sin reloj. Un datetime es una fecha más una hora. Si no necesitas el reloj, date es la elección más ordenada.
Crear fechas específicas
Construye directamente:
Los argumentos son year, month, day para date, y hasta year, month, day, hour, minute, second, microsecond para datetime.
Leer campos
Cada date/datetime tiene atributos:
isoformat() es tu amigo para salida legible por máquinas — produce algo como "2026-04-20T09:30:15" que otros sistemas pueden parsear sin ambigüedad.
Formatear con strftime
Para salida legible por humanos, .strftime(fmt) convierte una date o datetime en un string formateado:
Los códigos de formato que más vale la pena recordar:
%Y— año de 4 dígitos (2026)%m— número de mes, rellenado con cero (04)%d— día del mes, rellenado con cero (20)%H/%I— hora, formato 24/12 horas%M— minuto%S— segundo%A/%a— nombre del día entero / abreviado (Monday / Mon)%B/%b— nombre del mes entero / abreviado (April / Apr)%p— AM/PM
No necesitas memorizarlos; marca una referencia y búscalos cuando necesites uno.
Parsear con strptime
La dirección inversa: coge un string con una forma conocida y conviértelo en un datetime:
El string de formato debe coincidir con la entrada exactamente. Si no, strptime lanza ValueError.
Para strings ISO-8601 (el estándar legible por máquina), hay un atajo más simple en Python moderno:
Si tratas con formatos aleatorios, el paquete externo dateutil (pip install python-dateutil) tiene un parser.parse() indulgente que hace una suposición razonable.
Aritmética con timedelta
Para hacer matemáticas sobre fechas, usa timedelta para la diferencia u offset:
Argumentos de timedelta: days, seconds, microseconds, milliseconds, minutes, hours, weeks. Nada de months ni years — los meses son de longitud variable. Para matemáticas de mes/año, usa dateutil.relativedelta:
from dateutil.relativedelta import relativedelta
from datetime import date
today = date.today()
next_quarter = today + relativedelta(months=3)
print(next_quarter)
Zonas horarias: naive vs aware
Un datetime sin información de zona horaria es naive — Python no sabe qué zona horaria representa. Las matemáticas sobre datetimes naive están bien mientras te quedes dentro de una zona horaria lógica; los problemas empiezan en el momento en que datos de distintas zonas se juntan.
Un datetime aware lleva información de zona consigo. Adjunta una zona horaria explícitamente:
Python 3.9 añadió el módulo zoneinfo para zonas horarias con nombre (usando la base de datos IANA del sistema):
Convierte entre zonas con .astimezone():
Una regla que vale la pena comprometer a memoria: guarda los datetimes en UTC, convierte a zonas locales solo en el momento de mostrar. Ese único hábito previene la mayoría de bugs de zona horaria.
Timestamps
Un timestamp Unix es el número de segundos desde el 1970-01-01 UTC. Python convierte fácilmente:
Los timestamps son útiles para comparaciones, ordenación e interoperabilidad con otros sistemas. Para salida orientada a humanos, convierte de vuelta a un datetime primero.
Medir cuánto tarda algo
Para cronometrajes rápidos, resta dos datetimes:
Para medición de rendimiento más seria, usa time.perf_counter() — tiene resolución sub-microsegundo y es inmune a cambios del reloj del sistema. datetime.now() está bien para números del estilo "¿cuánto tardó esta llamada a API?".
Patrones que reutilizarás
Qué te llevas
date,datetimeytimedeltacubren el 90% de necesidades.- Usa ISO-8601 para legible por máquina;
strftimepara legible por humanos. - Guarda en UTC; convierte al mostrar.
- Usa
zoneinfopara zonas horarias con nombre. - Para meses y años, recurre a
dateutil.relativedelta.
Una herramienta más para tu kit del mundo real: las expresiones regulares, a continuación.
Preguntas frecuentes
¿Cómo obtengo la fecha y hora actuales en Python?
datetime.now() devuelve la fecha y hora local actual. datetime.utcnow() devuelve UTC (aunque la preferencia moderna es datetime.now(timezone.utc) ya que utcnow() devuelve un datetime naive). Para solo la fecha, usa date.today().
¿Cómo formateo una fecha como string?
Usa .strftime(format) con códigos de formato como %Y-%m-%d para año-mes-día. Ejemplo: datetime.now().strftime('%Y-%m-%d %H:%M'). Para parsear un string de vuelta, usa datetime.strptime(text, format) con los mismos códigos de formato.
¿Cómo añado días a una fecha en Python?
Usa timedelta: from datetime import date, timedelta; date.today() + timedelta(days=7). timedelta soporta days, hours, minutes, seconds, weeks y más. Para matemática de meses y años, usa el dateutil.relativedelta externo — timedelta no conoce los meses.