Séries Temporais
Dados indexados por tempo precisam de agrupamento ciente do calendário, estatísticas deslizantes e regras explícitas de fuso horário - o DatetimeIndex do pandas fornece os mecanismos.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
import pandas as pd
ts = df.set_index("ordered_at").sort_index()
daily = ts["revenue"].resample("D").sum()
roll = daily.rolling(7, min_periods=3).mean()
local = ts.index.tz_convert("America/New_York")Quando usar isso:
- Vendas ou métricas indexadas por timestamps de eventos
- Redução de logs de alta frequência para KPIs horários/diários
- Detecção de anomalias deslizantes em fluxos de sensores
- Alinhamento de dados de múltiplas regiões a um fuso horário de relatório
Exemplo de Trabalho
import pandas as pd
idx = pd.date_range("2025-01-01", periods=48, freq="h", tz="UTC")
events = pd.DataFrame(
{"revenue": range(48), "region": ["East"] * 24 + ["West"] * 24},
index=idx,
)
events.index.name = "ts"
# Totais diários por região (largo)
daily = (
events.groupby([pd.Grouper(freq="D"), "region"])["revenue"]
.sum()
.unstack(fill_value=0)
)
# Média deslizante de 7 dias na coluna East
daily["East_roll7"] = daily["East"].rolling(7, min_periods=3).mean()
# Reindexação para dias úteis com preenchimento para frente para lacunas de relatório
biz = daily.asfreq("B").ffill()
# Exibição no horário Leste dos EUA
eastern = events.index.tz_convert("America/New_York")
print(daily.head())
print("primeira hora Leste:", eastern[0])O que isso demonstra:
- Construção de índice horário UTC
Grouper(freq="D")para agrupamentos diários de calendário- Média deslizante com
min_periodspara evitar janelas minúsculas asfreq+ffillpara alinhamento de dias úteis
Mergulho Profundo
Como Funciona
- Um
DatetimeIndexarmazena int64 nanosegundos mais metadados de fuso horário. resampleagrupa em períodos regulares (strings de regra comoD,ME,h).rollingdesliza uma janela fixa;expandingcresce a partir do início.- Comparações de fuso horário ingênuas vs. cientes geram erros no pandas 2.x - padronize na ingestão.
Aliases de Frequência
| Regra | Significado |
|---|---|
h | Horário |
D | Dia de calendário |
B | Dia útil |
ME | Fim do mês |
W-MON | Semanal segunda-feira |
Notas Python
import pandas as pd
# Analisa formatos mistos, força UTC
pd.to_datetime(series, format="mixed", utc=True)
# Desloca para recursos de atraso
df["revenue_lag1"] = df["revenue"].shift(1)Armadilhas
- Índice não ordenado -
resampleerollingassumem tempo ordenado. Correção:df.sort_index()primeiro. - Horários locais ingênuos - Lacunas e duplicatas do horário de verão. Correção: ingira UTC; converta com
tz_convertpara exibição. - Fim do mês vs. início do mês -
MSvsMEmuda os limites do KPI. Correção: documente o calendário de relatórios com as partes interessadas. - Janelas deslizantes em dados esparsos -
min_periods=windowpadrão produz muitos NA. Correção: diminuamin_periodsconscientemente ou impute lacunas. - Mistura de PeriodIndex e Timestamp - Padrões obsoletos quebram no pandas 2.x. Correção: use
DatetimeIndexde ponta a ponta.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
Polars group_by_dynamic | Grandes buckets de tempo preguiçosos | Pequenos notebooks apenas com pandas |
| statsmodels | ARIMA/decomposição sazonal | KPIs simples de reamostragem |
DuckDB date_trunc | Agregações de armazém nativas SQL | Operações de Series em máquina única |
np.convolve | Suavização FIR fixa em ndarray | Timestamps irregulares |
FAQs
Por que UTC na ingestão?
- Evita ambiguidades de horário de verão e facilita junções de múltiplas regiões.
- Converta para o fuso horário local apenas na camada de apresentação.
Qual é a diferença entre resample e groupby Grouper?
resamplefunciona diretamente no DatetimeIndex.Grouperse anexa às chaves de coluna emgroupby.
Como preencher datas ausentes com zero?
ts.resample("D").sum().asfreq("D", fill_value=0)Como calcular a mudança semana a semana?
weekly = ts.resample("W").sum()
wow = weekly.pct_change()Janelas deslizantes podem ser baseadas em tempo?
ts.rolling("7D").mean()- Requer DatetimeIndex ordenado.
Como lidar com eventos irregulares?
- Reamostre para uma grade regular e, em seguida, agregue.
- Ou use
merge_asofpara junções "as-of".
O que closed e label significam em resample?
closed="left"inclui a borda esquerda do bin.labeldefine qual timestamp nomeia o bucket.
Como detectar timestamps duplicados?
ts.index.duplicated().any()- Agregue duplicatas antes de reamostrar.
Como exportar para Excel com datas?
- Mantenha o dtype datetime; evite converter para strings antes de
to_excel.
O Polars substitui as séries temporais do pandas?
- Polars se destaca em escala; pandas ainda lidera em EDA interativa.
- Ambos usam Arrow internamente em pilhas modernas.
Relacionado
- GroupBy & Agregação - Padrões Grouper
- Limpeza e Transformação de Dados - analisar datas no carregamento
- Junções e Mesclagens -
merge_asof - Desempenho e Memória - redução de amostragem de séries grandes
Versões da Stack: Esta página foi escrita para Python 3.14.0 (stable 3.14, maintenance 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+, e uv 0.6+.