pendulum / arrow
pendulum y arrow mejoran la ergonomía de datetime: análisis de cadenas ambiguas, deltas fluidos, conversión de zonas horarias y diferencias legibles por humanos. zoneinfo de Python 3.9+ cubre muchas necesidades, pero estas bibliotecas todavía brillan en CLIs, informes y bases de código heredadas.
Receta
import pendulum
now = pendulum.now("UTC")
tomorrow = now.add(days=1)
parsed = pendulum.parse("2026-07-09 14:30", tz="America/Chicago")
print(parsed.in_timezone("Europe/London").to_iso8601_string())Cuándo recurrir a esto:
- Analizar cadenas de fechas inconsistentes de exportaciones CSV o APIs de terceros
- Mostrar tiempo relativo ("hace 2 horas") en herramientas de administración
- Programar informes en hora local con conocimiento del horario de verano
- Scripts rápidos donde el código repetitivo de
zoneinfose siente pesado
Ejemplo de trabajo
from __future__ import annotations
import pendulum
def next_billing_run(anchor: str, tz: str = "UTC") -> pendulum.DateTime:
"""Devuelve la próxima ejecución mensual a las 02:00 local en el día de anclaje."""
base = pendulum.parse(anchor, tz=tz)
run = base.replace(hour=2, minute=0, second=0, microsecond=0)
now = pendulum.now(tz)
while run <= now:
run = run.add(months=1)
return run.in_timezone("UTC")
def format_relative(dt: pendulum.DateTime) -> str:
return dt.diff_for_humans()
if __name__ == "__main__":
utc_run = next_billing_run("2026-01-15", tz="America/New_York")
print(utc_run.to_iso8601_string())
print(format_relative(pendulum.now("UTC").subtract(hours=3)))Lo que esto demuestra:
pendulum.parseacepta cadenas similares a ISO con zona horaria explícitaadd(months=1)maneja mejor los casos extremos de fin de mes quetimedeltamanual- Ancla de facturación calculada en zona horaria local, almacenada/exportada como UTC
diff_for_humanspara mensajes dirigidos al operador
Inmersión profunda
Cómo funciona
- pendulum - Subclase de
datetime; las instancias son en su mayoría compatibles con las APIs de la librería estándar. - arrow - API fluida similar;
arrow.get()analiza muchos formatos;shift()agrega unidades de calendario. - Zonas horarias - Ambos utilizan la base de datos de zonas horarias IANA (pendulum incluye tzdata en Windows).
- Superposición de la librería estándar -
datetimede Python 3.14 +zoneinfo+dateutil.parsercubre el análisis para pipelines ISO estrictos.
pendulum vs arrow vs librería estándar
| Biblioteca | Fortaleza | Contrapartida |
|---|---|---|
| pendulum | Ayudantes amigables con la mutabilidad, humanización de duraciones | Dependencia adicional |
| arrow | API compacta, buena para scripts rápidos | Comunidad más pequeña que pendulum |
| zoneinfo + datetime | Sin dependencia, explícito | Más código repetitivo para análisis ambiguo |
Notas de Python
from datetime import datetime
from zoneinfo import ZoneInfo
# Equivalente de la librería estándar para el límite de almacenamiento
utc = datetime.now(ZoneInfo("UTC"))
local = utc.astimezone(ZoneInfo("America/Chicago"))Trampas
- Datetimes ingenuos en bases de datos - Errores de horario de verano y tiempos locales ambiguos. Solución:
TIMESTAMPTZ+ almacenamiento UTC. - Análisis sin zona horaria -
"2026-07-09"significa instantes diferentes a nivel mundial. Solución: requerir explícitamente el desplazamiento o la zona horaria predeterminada de la organización. - Mezclar pendulum y la librería estándar sin darse cuenta - Algunas APIs esperan solo
datetime. Solución:.naive()o convertir a través de.in_timezone("UTC")a la librería estándar. - Análisis dependiente de la configuración regional -
"09/07/2026"es ambiguo (EE. UU. vs. UE). Solución: forzar ISO 8601 en los límites de la API. - Usar
.timestamp()en valores ingenuos - Época incorrecta en servidores que no están en UTC. Solución: adjuntar la zona horaria antes de las operaciones de timestamp. - Bibliotecas pesadas para una llamada de formato - Costo de importación en arranques en frío de Lambda. Solución:
fromisoformatde la librería estándar solo para ISO estricto.
Alternativas
| Alternativa | Usar cuando | No usar cuando |
|---|---|---|
zoneinfo + datetime | Nuevos servicios con entradas ISO estrictas | Fechas ambiguas ingresadas por humanos |
python-dateutil | Flexibilidad del analizador sin pendulum completo | Quieres diferencias humanizadas integradas |
pandas.to_datetime | ETL de columnas en DataFrames | Código de aplicación no tabular |
| Almacenar milisegundos de época en JSON | Contratos de API con timestamps enteros | Necesitas aritmética de meses calendario |
Preguntas frecuentes
¿pendulum o arrow en 2026?
Ambos funcionan; pendulum tiene un mantenimiento y documentación más amplios. Para aplicaciones nuevas con APIs ISO estrictas, zoneinfo puede ser suficiente.
¿Son los objetos pendulum serializables en JSON?
Convierte a cadena ISO antes de JSON - la misma regla que para datetime de la librería estándar.
¿Cómo pruebo el código dependiente del tiempo?
Inyecta una función de reloj invocable o usa pendulum.set_test_now() / freezegun en las pruebas.
¿Maneja pendulum los segundos intercalares?
Igual que la librería estándar: las marcas de tiempo POSIX ignoran los segundos intercalares; usa UTC para los registros independientemente.
¿Cómo funcionan las adiciones de mes en el 31 de enero?
Las bibliotecas típicamente ajustan o ruedan hasta el final del mes; verifica que el comportamiento coincida con las reglas de facturación.
¿Puedo usar pendulum con SQLAlchemy?
Sí, almacena columnas datetime UTC; convierte al leer para las capas de visualización.
¿Qué pasa con el soporte de zonas horarias de Django?
Las utilidades timezone de Django se integran con zoneinfo; pendulum es opcional en los comandos de administración.
¿Cómo analizo las fechas de correo electrónico RFC 2822?
email.utils.parsedate_to_datetime en la librería estándar; no necesitas pendulum a menos que quieras encadenamiento fluido.
¿Arrow se mantiene todavía?
Verifica la cadencia de lanzamiento de PyPI antes de nuevas dependencias; pendulum es la opción predeterminada más segura para nuevos proyectos.
¿Cómo formateo para registros?
Siempre registra ISO 8601 UTC con desplazamiento: 2026-07-09T14:30:00+00:00.
Relacionado
- datetime, zoneinfo y Hora - base de la librería estándar
- Validación de Datos - campos de fecha en pipelines
- pydantic-settings - configuración con tipos de fecha
- openpyxl / python-docx / reportlab - fechas en hojas de cálculo
Versiones de la pila: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+ y uv 0.6+.