Fechas en pandas: datetime paso a paso

Trabajar con fechas en pandas requiere más que cambiar el formato visible. Una columna debe convertirse a un tipo temporal para poder ordenar cronológicamente, calcular duraciones, agrupar periodos y manejar zonas horarias sin comparar textos.
Convertir texto con to_datetime
import pandas as pd
df["fecha"] = pd.to_datetime(
df["fecha"],
format="%Y-%m-%d",
errors="coerce",
)
Declarar format evita ambigüedad y puede acelerar el proceso. errors="coerce" convierte valores inválidos en NaT; no los ignores:
invalidas = df.loc[df["fecha"].isna(), "fecha_original"]
Con formatos mezclados, limpia por fuente o usa una estrategia explícita. 01/02/2026 puede significar 1 de febrero o 2 de enero.
Extraer componentes con dt
df["anio"] = df["fecha"].dt.year
df["mes"] = df["fecha"].dt.month
df["dia_semana"] = df["fecha"].dt.day_name()
df["inicio_mes"] = df["fecha"].dt.to_period("M").dt.to_timestamp()
Para ordenar meses, conserva un número o periodo. Los nombres de mes como texto se ordenan alfabéticamente.
Filtrar por rango
inicio = pd.Timestamp("2026-01-01")
fin = pd.Timestamp("2026-04-01")
trimestre = df.loc[
(df["fecha"] >= inicio) &
(df["fecha"] < fin)
]
El intervalo semiabierto incluye el inicio y excluye el límite siguiente. Evita inventar 23:59:59, que falla con mayor precisión temporal.
También puedes usar:
df.loc[df["fecha"].between("2026-01-01", "2026-03-31")]
Comprueba la inclusividad apropiada para tu versión y necesidad.
Calcular duraciones
df["duracion"] = df["fecha_fin"] - df["fecha_inicio"]
df["dias"] = df["duracion"].dt.total_seconds() / 86400
.dt.days devuelve días enteros del componente; total_seconds() conserva fracciones. Para meses de calendario, una división fija entre 30 no es una equivalencia exacta.
Agrupar con resample
Con índice temporal:
mensual = (
df.set_index("fecha")
.resample("MS")["importe"]
.sum()
)
MS etiqueta el inicio del mes. La frecuencia y el cierre de intervalos cambian el significado, especialmente en semanas o cierres financieros.
Sin mover la fecha al índice:
mensual = (
df.groupby(pd.Grouper(key="fecha", freq="MS"))["importe"]
.sum()
.reset_index()
)
Zonas horarias
Una fecha “ingenua” no tiene zona; una fecha consciente sí:
eventos["instante"] = pd.to_datetime(
eventos["instante"],
utc=True,
)
eventos["hora_mexico"] = (
eventos["instante"].dt.tz_convert("America/Mexico_City")
)
tz_localize asigna una zona a horas que ya representan tiempo local; tz_convert cambia la representación de instantes que ya tienen zona. Confundirlas desplaza eventos.
Almacena instantes en UTC y convierte para presentación, pero conserva la zona comercial cuando define cierres diarios. Los cambios de horario crean horas ambiguas o inexistentes; define una política.
Unir por tiempo
Para asociar cada lectura con el evento anterior más cercano:
resultado = pd.merge_asof(
lecturas.sort_values("instante"),
eventos.sort_values("instante"),
on="instante",
direction="backward",
tolerance=pd.Timedelta("10min"),
)
merge_asof exige orden y una tolerancia razonable. Es diferente de un merge exacto.
Fechas faltantes
NaT es la ausencia temporal. Mide su origen antes de eliminar o imputar. Una fecha de entrega nula puede significar “todavía no entregado”, no un error. La guía de valores nulos en pandas ayuda a separar esos casos.
Rendimiento
- Convierte una vez, no dentro de cada filtro.
- Declara formato cuando sea estable.
- Evita funciones Python fila por fila.
- Usa operaciones
.dtvectorizadas. - Selecciona solo columnas necesarias al leer.
- Conserva tipos Parquet temporales cuando sea posible.
Errores frecuentes
- Comparar fechas como texto.
- Interpretar día y mes al revés.
- Mezclar valores con y sin zona.
- Usar
tz_localizecuando correspondíatz_convert. - Filtrar el final del día con una hora artificial.
- Agrupar enero de distintos años usando solo
.dt.month. - Convertir inválidos a NaT y no auditarlos.
- Promediar duraciones sin revisar extremos.
Para series complejas, la guía de análisis de series temporales amplía frecuencia, tendencia y validación cronológica.
Preguntas frecuentes
¿Cómo convierto una columna a fecha en pandas?
Usa pd.to_datetime, declara format cuando lo conozcas y revisa los valores convertidos a NaT.
¿Qué es NaT?
Es la representación de un valor temporal ausente, análoga a otros valores nulos de pandas.
¿Cómo filtro un mes completo?
Usa un intervalo desde el primer día inclusive hasta el primer día del mes siguiente exclusivo.
¿Cuál es la diferencia entre tz_localize y tz_convert?
tz_localize asigna zona a horas ingenuas; tz_convert representa en otra zona instantes que ya están localizados.
¿Cómo agrupo por mes?
Usa resample con índice temporal o pd.Grouper sobre la columna de fecha, eligiendo la frecuencia y etiqueta correctas.
¿Por qué no conviene guardar fechas como texto?
Porque el orden, los filtros, las duraciones y las zonas horarias pueden producir resultados incorrectos o muy difíciles de validar.

Deja una respuesta