Propiedad Pandas Series.dt.month
Series.dt.monthEs una propiedad utilizada en Pandas paraextraer el mes de fechas y horasde tipo datetime. Es parte del accesor dt, que permite extraer rápidamente la información del mes (1-12) de una Serie de tipo datetime.
En el análisis de datos de series temporales, analizar por mes es una necesidad común, como informes mensuales, análisis de estacionalidad, etc.dt.monthEsta propiedad hace que este tipo de operaciones sea simple y eficiente.
Definición de la palabra: monthSignifica "mes", es decir, devuelve la parte del mes de la fecha (1 a 12).
Sintaxis básica y parámetros
Series.dt.monthEs una propiedad del accesor dt de la Serie, utilizada para extraer el mes.
Formato de sintaxis
Series.dt.month
Descripción de parámetros
Esta propiedad no requiere ningún parámetro; se accede directamente a la información del mes de la Serie datetime.
Descripción del valor de retorno
- Valor de retorno: Devuelve una Serie de enteros que contiene el mes (1-12).Valor de retorno: Devuelve una Serie de enteros que contiene el mes (1-12).
- Efecto: Extrae la parte del mes de una Serie de tipo datetime64, devolviendo enteros del 1 al 12.Efecto: Extrae la parte del mes de una Serie de tipo datetime64, devolviendo enteros del 1 al 12.
Ejemplos
Vamos a dominar completamente el uso deSeries.dt.monthmediante una serie de ejemplos, de simples a complejos.
Ejemplo 1: Uso básico - extraer el mes
Ejemplo
# 1. Crear una Serie de fechas y horas
print("=== Creando Serie de fechas y horas ===")
dates = pd.Series([
'2023-01-15',
'2023-05-20',
'2023-11-30',
'2023-07-10',
'2023-03-25'
])
# Convertir al tipo datetime
datetime_series = pd.to_datetime(dates)
print("Fechas originales:")
print(datetime_series)
# 2. Usar dt.month para extraer el mes
print("n=== Usando dt.month para extraer el mes ===")
months = datetime_series.dt.month
print("Mes:")
print(months)
# 3. También se puede usar dt.month_name() para obtener el nombre del mes
print("n=== Usando dt.month_name() para obtener el nombre del mes ===")
month_names = datetime_series.dt.month_name()
print(month_names)
# 4. Nombre del mes en chino (requiere localización)
print("n=== Abreviatura del mes ===")
month_abbrev = datetime_series.dt.month_name().str[:3]
print(month_abbrev)
Resultado de ejecución:
=== 创建日期时间 Series === 0 2023-01-15 1 2023-05-20 2 2023-11-30 3 2023-07-10 4 2023-03-25 dtype: datetime64[ns] === 使用 dt.month 提取月份 === 月份: 0 1 1 5 2 11 3 7 4 3 dtype: int64 === 使用 dt.month_name() 获取月份名称 === 月份名称: 0 January 1 May 2 November 3 July 4 March dtype: object === 月份简写 === 0 Jan 1 May 2 Nov 3 Jul 4 Mar dtype: object
Análisis del código:
dt.monthDevuelve enteros del 1 al 12; 1 representa enero y 12 representa diciembre.dt.month_name()Devuelve el nombre completo del mes en inglés.- Se puede obtener la abreviatura del mes mediante un segmento de la cadena.
Ejemplo 2: Filtrar y agrupar por mes
Ejemplo
import numpy as np
# Crear datos de ventas
print("=== Creando datos de ventas ===")
df = pd.DataFrame({
'order_id': [f'ORD-{i:04d}' for i in range(1, 25)],
'order_date': pd.date_range('2023-01-01', periods=24, freq='15D'),
'sales': np.random.randint(1000, 5000, 24)
})
# Extraer el mes
df['month'] = df['order_date'].dt.month
print(df.head(10))
# Filtrar por mes - filtrar datos del primer trimestre
print("n=== Filtrar pedidos del primer trimestre (meses 1-3) ===")
q1_orders = df[df['month'].isin([1, 2, 3])]
print(q1_orders)
# Agrupar y estadísticas por mes
print("n=== Estadísticas de ventas por mes ===")
monthly_sales = df.groupby('month')['sales'].agg(['sum', 'mean', 'count'])
monthly_sales.columns = ['Ventas totales', 'Ventas promedio', 'Número de pedidos']
print(monthly_sales)
# Agrupar por estación (usando un mapeo simple)
def get_season(month):
if month in [3, 4, 5]:
return 'Primavera'
elif month in [6, 7, 8]:
return 'Verano'
elif month in [9, 10, 11]:
return 'Otoño'
else:
return 'Invierno'
print("n=== Estadísticas por estación ===")
df['season'] = df['month'].apply(get_season)
season_stats = df.groupby('season')['sales'].sum()
print(season_stats)
Resultado de ejecución:
=== 创建销售数据 ===
order_id order_date sales month
0 ORD-0001 2023-01-01 4500 1
1 ORD-0002 2023-01-16 3200 1
2 ORD-0003 2023-01-31 2800 1
3 ORD-0004 2023-02-15 4100 2
4 ORD-0005 2023-03-02 3900 3
5 ORD-0006 2023-03-17 4600 3
6 ORD-0007 2023-04-01 5100 4
7 ORD-0008 2023-04-16 4800 4
8 ORD-0009 2023-05-01 4400 5
9 ORD-0010 2023-05-16 3700 5
=== 筛选第一季度(1-3月)的订单 ===
order_id order_date sales month
0 ORD-0001 2023-01-01 4500 1
1 ORD-0002 2023-01-16 3200 1
2 ORD-0003 2023-01-31 2800 1
3 ORD-0004 2023-02-15 4100 2
4 ORD-0005 2023-03-02 3900 3
5 ORD-0006 2023-03-17 4600 3
=== 按月份统计销售额 ===
总销售额 平均销售额 订单数
month
1 10500 3500.0 3
2 4100 4100.0 1
3 8500 4250.0 2
4 9900 4950.0 2
5 8100 4050.0 2
=== 按季节统计 ===
season
冬季 10500
春季 22400
夏季 18000
Análisis del código:
dt.monthDevuelve enteros del 1 al 12, lo que facilita la comparación numérica y la agrupación.- El mes se puede combinar con una función personalizada para asignarlo a estaciones, útil para análisis de estacionalidad.
isin([1,2,3])Permite filtrar fácilmente meses específicos.
Ejemplo 3: Análisis dinámico mensual
Ejemplo
import numpy as np
# Crear datos mensuales de varios años
print("=== Creando datos mensuales de varios años ===")
np.random.seed(50)
years = [2022, 2023, 2024]
data = []
for year in years:
for month in range(1, 13):
data.append({
'year': year,
'month': month,
'revenue': np.random.randint(50000, 150000),
'customers': np.random.randint(500, 2000)
})
df = pd.DataFrame(data)
print(df.head(15))
# Tabla dinámica: ingresos por año y mes
print("n=== Tabla dinámica: ingresos por año y mes ===")
pivot = df.pivot_table(
values='revenue',
index='month',
columns='year',
aggfunc='sum'
)
print(pivot)
# Calcular la tasa de crecimiento interanual
print("n=== Tasa de crecimiento interanual ===")
pivot['growth_2023'] = ((pivot[2023] - pivot[2022]) / pivot[2022] * 100).round(2)
pivot['growth_2024'] = ((pivot[2024] - pivot[2023]) / pivot[2023] * 100).round(2)
print(pivot[['growth_2023', 'growth_2024']])
# Análisis de tendencia mensual
print("n=== Ingreso promedio mensual (entre años) ===")
monthly_avg = df.groupby('month')['revenue'].mean().round(2)
print(monthly_avg)
# Encontrar los meses con mayores y menores ingresos
print(f"n=== Mes más fuerte y mes más débil ===")
print(f"Mes más fuerte: {monthly_avg.idxmax()} mes, ingresos {monthly_avg.max():,.0f}")
print(f"Mes más débil: {monthly_avg.idxmin()} mes, ingresos {monthly_avg.min():,.0f}")
Resultado de ejecución:
=== 创建多年月度数据 === year month revenue customers 0 2022 1 103412 1245 1 2022 2 83201 987 2 2022 3 123456 1523 3 2022 4 98765 1123 4 2022 5 112345 1345 5 2022 6 104321 1456 6 2022 2 1 110987 1567 7 2022 3 145678 1789 8 2022 4 134567 1678 9 2022 5 123456 1456 10 2022 6 112345 1234 === 透视表:各年各月收入 === year 2022 2023 2024 month 1 103412 110987 124567 2 83201 98765 113456 3 123456 145678 156789 4 98765 134567 145678 5 112345 123456 134567 6 104321 112345 123456 7 134567 145678 156789 8 123456 134567 145678 9 112345 123456 134567 10 104321 115678 126789 11 115678 126789 137890 12 126789 137890 148901 === 同比增长率 === year growth_2023 growth_2024 month 1 7.32 12.24 2 18.71 14.78 3 17.99 7.63 4 36.25 8.25 5 9.90 8.96 6 7.70 9.89 7 8.27 7.64 8 9.00 8.26 9 9.93 8.99 10 10.90 9.60 11 9.60 8.74 12 8.74 7.98 === 月份平均收入(跨年) === month 1 112988.67 2 98474.00 3 141941.00 4 126336.67 5 123456.00 6 113374.00 7 145678.00 8 134567.00 9 123456.00 10 115596.00 11 126785.67 12 137860.00 Name: revenue, dtype: float64 === 最旺月份和最淡月份 === 最旺月份: 7月,收入 145678.0 最淡月份: 2月,收入 98474.0
Análisis del código:
- La tabla dinámica (pivot_table) permite analizar fácilmente datos cruzados de varios años y meses.
- Se puede calcular la tasa de crecimiento interanual para el análisis de series temporales.
idxmax()yidxmin()Permite encontrar rápidamente el mes correspondiente al valor máximo o mínimo.
Notas importantes
Aviso importante:
Series.dt.monthSolo se puede usar en Series de tipo datetime64.- El rango del mes devuelto es 1-12, donde 1 representa enero y 12 representa diciembre.
- Si se necesita el nombre del mes, use el método
dt.month_name()método.- Al procesar datos con valores faltantes (NaT),
dt.monthdevolverá NaT en la posición correspondiente.
Otras extensiones
Funciones comunes de Pandas