pendulum / arrow
pendulum e arrow melhoram a ergonomia do datetime - análise de strings flexíveis, deltas fluentes, conversão de fuso horário e diferenças legíveis por humanos. O zoneinfo do Python 3.9+ cobre muitas necessidades, mas essas bibliotecas ainda brilham em CLIs, relatórios e bases de código legadas.
Receita
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())Quando usar:
- Analisar strings de data inconsistentes de exportações CSV ou APIs de terceiros
- Exibir tempo relativo ("2 horas atrás") em ferramentas de administração
- Agendar relatórios em horário local com consciência do horário de verão
- Scripts rápidos onde o boilerplate do
zoneinfoparece pesado
Exemplo de Trabalho
from __future__ import annotations
import pendulum
def next_billing_run(anchor: str, tz: str = "UTC") -> pendulum.DateTime:
"""Retorna a próxima execução mensal às 02:00 local no dia de ancoragem."""
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)))O que isso demonstra:
pendulum.parseaceita strings estilo ISO com tz explícitoadd(months=1)lida com casos extremos de fim de mês melhor do que timedelta manual- Âncora de faturamento calculada em tz local, armazenada/exportada como UTC
diff_for_humanspara mensagens voltadas para o operador
Mergulho Profundo
Como Funciona
- pendulum - Subclasse de
datetime; instâncias são em grande parte compatíveis com APIs stdlib. - arrow - API fluente semelhante;
arrow.get()analisa muitos formatos;shift()adiciona unidades de calendário. - Fusos Horários - Ambos usam o banco de dados tz IANA (pendulum inclui tzdata no Windows).
- Sobreposição stdlib - Python 3.14
datetime+zoneinfo+dateutil.parsercobre a análise para pipelines ISO estritos.
pendulum vs arrow vs stdlib
| Biblioteca | Força | Compromisso |
|---|---|---|
| pendulum | Auxiliares amigáveis à mutabilidade, humanização de duração | Dependência extra |
| arrow | API compacta, bom para scripts rápidos | Comunidade menor que pendulum |
| zoneinfo + datetime | Sem dependência, explícito | Mais boilerplate para análise flexível |
Notas Python
from datetime import datetime
from zoneinfo import ZoneInfo
# Equivalente stdlib para limite de armazenamento
utc = datetime.now(ZoneInfo("UTC"))
local = utc.astimezone(ZoneInfo("America/Chicago"))Armadilhas
- Datetimes ingênuos em bancos de dados - Bugs de horário de verão e horários locais ambíguos. Correção:
TIMESTAMPTZ+ armazenamento UTC. - Análise sem fuso horário -
"2026-07-09"significa instantes diferentes globalmente. Correção: exigir deslocamento ou tz da organização padrão explicitamente. - Misturar pendulum e stdlib sem perceber - Algumas APIs esperam apenas
datetime. Correção:.naive()ou converter via.in_timezone("UTC")para stdlib. - Análise dependente de localidade -
"09/07/2026"é ambíguo (EUA vs UE). Correção: impor ISO 8601 nas fronteiras da API. - Usar
.timestamp()em valores ingênuos - Época errada em servidores que não estão em UTC. Correção: anexar tz antes da matemática de timestamp. - Bibliotecas pesadas para uma chamada de formato - Custo de importação em inicializações a frio do Lambda. Correção:
fromisoformatda biblioteca padrão apenas para ISO estrito.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
zoneinfo + datetime | Novos serviços com entradas ISO estritas | Datas inseridas por humanos de forma flexível |
python-dateutil | Flexibilidade do analisador sem pendulum completo | Você quer diferenças humanizadas integradas |
pandas.to_datetime | ETL de colunas em DataFrames | Código de aplicativo não tabular |
| Armazenar ms de época em JSON | Contratos de API com timestamps inteiros | Você precisa de matemática de mês calendário |
FAQs
pendulum ou arrow em 2026?
Ambos funcionam; pendulum tem manutenção e documentação mais amplas. Para aplicativos novos com APIs ISO estritas, zoneinfo pode ser suficiente.
Objetos pendulum são serializáveis em JSON?
Converta para string ISO antes do JSON - a mesma regra que datetime da biblioteca padrão.
Como testar código dependente de tempo?
Injete uma callable de relógio ou use pendulum.set_test_now() / freezegun em testes.
pendulum lida com segundos bissextos?
O mesmo que a biblioteca padrão - timestamps POSIX ignoram segundos bissextos; use UTC para logs de qualquer maneira.
Como funcionam as adições de mês em 31 de janeiro?
As bibliotecas normalmente limitam ou rolam para o fim do mês - verifique se o comportamento corresponde às regras de faturamento.
Posso usar pendulum com SQLAlchemy?
Sim - armazene colunas datetime UTC; converta na leitura para camadas de exibição.
E o suporte a fuso horário do Django?
As utilidades timezone do Django se integram com zoneinfo; pendulum é opcional em comandos de gerenciamento.
Como analisar datas de e-mail RFC 2822?
email.utils.parsedate_to_datetime na biblioteca padrão - não há necessidade de pendulum, a menos que você queira encadeamento fluente.
Arrow ainda é mantido?
Verifique a cadência de lançamento do PyPI antes de novas dependências - pendulum é a opção mais segura para novos projetos.
Como formatar para logs?
Sempre registre ISO 8601 UTC com deslocamento: 2026-07-09T14:30:00+00:00.
Relacionados
- datetime, zoneinfo & Time - base da biblioteca padrão
- Validação de Dados - campos de data em pipelines
- pydantic-settings - configuração com tipos de data
- openpyxl / python-docx / reportlab - datas em planilhas
Versões da Stack: Esta página foi escrita para Python 3.14.0 (3.14 estável, 3.13 em manutenção), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+ e uv 0.6+.