Propiedad Pandas Series.dt.month

Pandas 通用函数Funciones comunes de Pandas


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

import pandas as pd

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

  1. dt.monthDevuelve enteros del 1 al 12; 1 representa enero y 12 representa diciembre.
  2. dt.month_name()Devuelve el nombre completo del mes en inglés.
  3. Se puede obtener la abreviatura del mes mediante un segmento de la cadena.

Ejemplo 2: Filtrar y agrupar por mes

Ejemplo

import pandas as pd
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 pandas as pd
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étododt.month_name()método.
  • Al procesar datos con valores faltantes (NaT),dt.monthdevolverá NaT en la posición correspondiente.

Pandas 常用函数Funciones comunes de Pandas

Otras extensiones