Fecha y hora en Pandas
Pandas proporciona potentes capacidades de procesamiento de fecha y hora, lo que permite convertir fácilmente cadenas a tipos de fecha y realizar diversos cálculos y análisis relacionados con fechas.
Crear fecha y hora
Función date_range
Ejemplo
# Crear rango de fechas
dates = pd.date_range("2024-01-01", periods=10, freq="D")
print(Por día:)
print(dates)
print()
# Por mes
dates_month = pd.date_range("2024-01-01", periods=12, freq="M")
print(Por mes:)
print(dates_month)
print()
# Por hora
dates_hour = pd.date_range("2024-01-01 00:00", periods=24, freq="H")
print(Por hora (primeros 5):)
print(dates_hour[:5])
DatetimeIndex y DatetimeArray
Ejemplo
import numpy as np
# Crear usando objetos datetime
dt = pd.DatetimeIndex([
pd.Timestamp("2024-01-01"),
pd.Timestamp("2024-01-02"),
pd.Timestamp("2024-01-03")
])
print("DatetimeIndex:")
print(dt)
print()
# Crear una Series con fecha y hora
s = pd.Series(
[100, 200, 300],
index=pd.date_range("2024-01-01", periods=3, freq="D")
)
print(Series con índice de fechas:)
print(s)
Convertir cadenas a fechas
pd.to_datetime
Ejemplo
# Convertir cadenas de varios formatos a fechas
dates_str = ["2024-01-01", "2024/01/02", "01-03-2024", "20240104"]
# Inferir formato automáticamente
dt = pd.to_datetime(dates_str)
print(Formato inferido automáticamente:)
print(dt)
print()
# Especificar formato
dt2 = pd.to_datetime(dates_str, format="%Y-%m-%d")
print(Formato especificado:)
print(dt2)
print()
# Manejar valores no válidos
dt3 = pd.to_datetime(["2024-01-01", "invalid", "2024-01-03"], errors="coerce")
print(Manejo de valores no válidos (convertidos a NaT):)
print(dt3)
read_csv analiza fechas automáticamente
Ejemplo
from io import StringIO
# Simular datos CSV
csv_data = """Fecha,Ventas
2024-01-01,100
2024-01-02,200
2024-01-03,150
"""
# Método 1: Convertir después de la lectura
df = pd.read_csv(StringIO(csv_data))
df[Fecha] = pd.to_datetime(df[Fecha])
print(Conversión después de la lectura:)
print(df.dtypes)
print()
# Método 2: Analizar durante la lectura
df2 = pd.read_csv(StringIO(csv_data), parse_dates=[Fecha])
print(Análisis durante la lectura:)
print(df2.dtypes)
Acceso a atributos de fecha
Después de convertir la fecha y hora al tipo datetime, se pueden extraer fácilmente varios atributos.
Ejemplo
# Crear una Series de fechas
s = pd.Series(pd.date_range("2024-01-15", periods=5, freq="D"))
print(Series de fechas:)
print(s)
print()
# Extraer año/mes/día
print(Extraer año:)
print(s.dt.year)
print()
print(Extraer mes:)
print(s.dt.month)
print()
print(Extraer día:)
print(s.dt.day)
print()
# Extraer día de la semana (0=lunes, 6=domingo)
print(Día de la semana (número):)
print(s.dt.dayofweek)
print()
# Extraer nombre del día de la semana
print(Nombre del día de la semana:)
print(s.dt.day_name())
Más atributos de fecha
| Atributo | Descripción | Ejemplo |
|---|---|---|
year |
año | 2024 |
month |
Mes (1-12) | 1 |
day |
Día (1-31) | 15 |
hour |
Hora (0-23) | 10 |
minute |
Minuto (0-59) | 30 |
dayofweek |
Día de la semana (0-6) | 0 |
quarter |
Trimestre (1-4) | 1 |
is_month_start |
Es inicio de mes | True/False |
is_month_end |
Es fin de mes | True/False |
Operaciones con fechas
Suma y resta de fechas
Ejemplo
# Crear una fecha
date = pd.Timestamp("2024-01-15")
print(fFecha base: {date})
print()
# Sumar/restar días
print(f+3 días: {date + pd.Timedelta(days=3)})
print(f-5 días: {date - pd.Timedelta(days=5)})
print()
# Diferencia entre fechas
date1 = pd.Timestamp("2024-01-01")
date2 = pd.Timestamp("2024-01-15")
print(fDiferencia de fechas: {date2 - date1})
print(fDiferencia en días: {(date2 - date1).days})
print()
# Operaciones con Series de fechas
dates = pd.date_range("2024-01-01", periods=5, freq="D")
print(Fecha + 3 días:)
print(dates + pd.Timedelta(days=3))
Desplazamiento de fechas
Ejemplo
date = pd.Timestamp("2024-01-15")
print(fFecha base: {date})
print()
# Inicio/fin de mes
print(fInicio de mes: {date + pd.offsets.MonthBegin(1)})
print(fFin de mes: {date + pd.offsets.MonthEnd(1)})
print()
# Desplazamiento de años
print(f+1 año: {date + pd.DateOffset(years=1)})
print(f-1 mes: {date + pd.DateOffset(months=-1)})
print()
# Días laborables
print(fPróximo lunes: {date + pd.offsets.Week(weekday=0)})
Manejo de zonas horarias
Ejemplo
# Crear una hora sin zona horaria
dates = pd.date_range("2024-01-01 10:00", periods=3, freq="H")
print(Sin zona horaria:)
print(dates)
print()
# Establecer zona horaria
dates_utc = dates.tz_localize("UTC")
print(Establecer zona horaria UTC:)
print(dates_utc)
print()
# Convertir zona horaria
dates_shanghai = dates_utc.tz_convert("Asia/Shanghai")
print(Convertir a zona horaria de Shanghái:)
print(dates_shanghai)
Práctica: Análisis de datos de ventas
Ejemplo
# Simular datos de ventas
df = pd.DataFrame({
Fecha: pd.date_range("2024-01-01", periods=30, freq="D"),
Ventas: [100, 150, 120, 180, 200, 90, 80] * 4 + [100, 100]
})
df[Fecha] = pd.to_datetime(df[Fecha])
print(Datos de ventas:)
print(df.head(10))
print()
# Estadísticas por día de la semana
print(Ventas promedio por día de la semana:)
weekday_sales = df.groupby(df[Fecha].dt.day_name())[Ventas].mean()
print(weekday_sales)
print()
# Estadísticas por mes
print(Estadísticas por mes:)
df[Mes] = df[Fecha].dt.to_period("M")
monthly_sales = df.groupby(Mes)[Ventas].sum()
print(monthly_sales)
print()
# Calcular media móvil de 7 días
df[Media móvil de 7 días] = df[Ventas].rolling(window=7).mean()
print(Añadir media móvil de 7 días:)
print(df.head(10))
Preguntas frecuentes
1. Formatos de fecha inconsistentes
Al usarpd.to_datetimese puede especificarformatel parámetro para aclarar el formato, evitando errores de análisis.
2. Confusión de zonas horarias
Al procesar datos entre zonas horarias, asegúrese de que todas las horas usen una zona horaria unificada o la hora UTC.
3. Las operaciones con fechas usan Timedelta
Para sumar o restar fechas, usepd.Timedelta, no una simple suma o resta de enteros.
Otras extensionesAl trabajar con datos de series temporales, se recomienda convertir las cadenas de fecha al tipo datetime lo antes posible para aprovechar las potentes funciones de fecha de Pandas.