Series Temporales
Los datos indexados por tiempo requieren agrupación consciente del calendario, estadísticas móviles y reglas explícitas de zona horaria; el DatetimeIndex de pandas proporciona la maquinaria.
Receta
Tarjeta de receta de referencia rápida, lista para copiar y pegar.
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")Cuándo usar esto:
- Ventas o métricas indexadas por marcas de tiempo de eventos
- Reducción de logs de alta frecuencia a KPIs horarios/diarios
- Detección de anomalías móviles en flujos de sensores
- Alineación de datos multirregión a una zona horaria de informes
Ejemplo de Trabajo
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"
# Totales diarios por región (ancho)
daily = (
events.groupby([pd.Grouper(freq="D"), "region"])["revenue"]
.sum()
.unstack(fill_value=0)
)
# Media móvil de 7 días en la columna East
daily["East_roll7"] = daily["East"].rolling(7, min_periods=3).mean()
# Reindexación de días hábiles con relleno hacia adelante para huecos de informes
biz = daily.asfreq("B").ffill()
# Mostrar en el Este de EE. UU.
eastern = events.index.tz_convert("America/New_York")
print(daily.head())
print("primera hora del Este:", eastern[0])Lo que esto demuestra:
- Construcción de índice horario UTC
Grouper(freq="D")para cubos diarios del calendario- Media móvil con
min_periodspara evitar ventanas pequeñas asfreq+ffillpara alineación de días hábiles
Inmersión Profunda
Cómo Funciona
- Un
DatetimeIndexalmacena int64 nanosegundos más metadatos de zona horaria. resampleagrupa en períodos regulares (cadenas de reglas comoD,ME,h).rollingdesliza una ventana fija;expandingcrece desde el principio.- Las comparaciones ingenuas vs. conscientes de zona horaria generan errores en pandas 2.x; estandarizar en la ingesta.
Alias de Frecuencia
| Regla | Significado |
|---|---|
h | Horario |
D | Día del calendario |
B | Día hábil |
ME | Fin de mes |
W-MON | Lunes semanal |
Notas de Python
import pandas as pd
# Analizar formatos mixtos, forzar UTC
pd.to_datetime(series, format="mixed", utc=True)
# Desplazar para características de rezago
df["revenue_lag1"] = df["revenue"].shift(1)Errores Comunes
- Índice desordenado -
resampleyrollingasumen tiempo ordenado. Solución:df.sort_index()primero. - Tiempos locales ingenuos de zona horaria - huecos y duplicados de DST. Solución: ingerir UTC; convertir con
tz_convertpara visualización. - Fin de mes vs. inicio de mes -
MSvsMEcambia los límites de KPI. Solución: documentar el calendario de informes con las partes interesadas. - Ventanas móviles en datos dispersos -
min_periodspredeterminado =windowproduce muchos NA. Solución: reducirmin_periodsa sabiendas o imputar huecos. - Mezcla de PeriodIndex y Timestamp - los patrones obsoletos fallan en pandas 2.x. Solución: usar
DatetimeIndexde extremo a extremo.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
Polars group_by_dynamic | Cubos de tiempo perezosos grandes | Cuadernos pequeños solo de pandas |
| statsmodels | ARIMA/descomposición estacional | KPIs de remuestreo simples |
DuckDB date_trunc | Agregaciones de almacén nativas de SQL | Operaciones de Series en una sola máquina |
np.convolve | Suavizado FIR fijo en ndarray | Marcas de tiempo irregulares |
Preguntas Frecuentes
¿Por qué UTC en la ingesta?
- Evita ambigüedades de DST y facilita las uniones multirregión.
- Convertir a la zona horaria local solo en la capa de presentación.
¿Cuál es la diferencia entre resample y groupby Grouper?
resampleopera directamente sobre DatetimeIndex.Grouperse adjunta a las claves de columna engroupby.
¿Cómo relleno fechas faltantes con cero?
ts.resample("D").sum().asfreq("D", fill_value=0)¿Cómo calculo el cambio semana a semana?
weekly = ts.resample("W").sum()
wow = weekly.pct_change()¿Pueden las ventanas móviles basarse en el tiempo?
ts.rolling("7D").mean()- Requiere un DatetimeIndex ordenado.
¿Cómo manejo eventos irregulares?
- Remuestrear a una cuadrícula regular y luego agregar.
- O usar
merge_asofpara uniones "as-of".
¿Qué significan closed y label en resample?
closed="left"incluye el borde izquierdo del cubo.labelestablece qué marca de tiempo nombra el cubo.
¿Cómo detecto marcas de tiempo duplicadas?
ts.index.duplicated().any()- Agregar duplicados antes de remuestrear.
¿Cómo exporto a Excel con fechas?
- Mantener el dtype datetime; evitar convertir a cadenas antes de
to_excel.
¿Polars reemplaza las series temporales de pandas?
- Polars sobresale en escala; pandas sigue liderando en EDA interactiva.
- Ambos usan Arrow internamente en pilas modernas.
Relacionado
- GroupBy & Agregación - Patrones de Grouper
- Limpieza y Transformación de Datos - analizar fechas al cargar
- Uniones y Combinaciones -
merge_asof - Rendimiento y Memoria - reducción de series grandes
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+.