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

import pandas as pd

# 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 pandas as pd
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

import pandas as pd

# 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

import pandas as pd
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

import pandas as pd

# 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

import pandas as pd

# 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

import pandas as pd

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

import pandas as pd

# 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

import pandas as pd

# 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.

Al 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.

Otras extensiones