Свойство Pandas Series.dt.month

Pandas 通用函数Pandas: общие функции


Series.dt.month— это свойство в Pandas, используемое дляизвлечения месяца из даты и времени.Оно является частью аксессора dt и позволяет быстро извлекать информацию о месяце (1-12) из datetime Series.

При анализе данных временных рядов анализ по месяцам является обычной задачей, например ежемесячные отчёты и сезонный анализ.dt.monthЭто свойство делает такие операции простыми и эффективными.

Значение слова: monthОзначает "месяц", то есть возвращает часть даты, соответствующую месяцу (от 1 до 12).


Базовый синтаксис и параметры

Series.dt.monthЭто свойство аксессора dt Series, используемое для извлечения месяца.

Формат синтаксиса

Series.dt.month

Описание параметра

Это свойство не требует параметров; оно напрямую обращается к информации о месяце в datetime Series.

Описание возвращаемого значения

  • Возвращаемое значение: Возвращает целочисленный Series (1-12), содержащий месяц.
  • Действие: Извлекает часть месяца из Series datetime64, возвращая целые числа от 1 до 12.

Примеры

Давайте подробно разберём на серии примеров от простого к сложному,Series.dt.monthего использование.

Пример 1: Базовое использование - извлечение месяца

Пример

import pandas as pd

# 1. Создайте Series с datetime
print("=== Создание Series типа datetime ===")
dates = pd.Series([
    '2023-01-15',
    '2023-05-20',
    '2023-11-30',
    '2023-07-10',
    '2023-03-25'
])

# Преобразование в тип datetime
datetime_series = pd.to_datetime(dates)
print("Исходные даты:")
print(datetime_series)

# 2. Используйте dt.month для извлечения месяца
print("n=== Используйте dt.month для извлечения месяца ===")
months = datetime_series.dt.month
print("Месяц:")
print(months)

# 3. Вы также можете использовать dt.month_name(), чтобы получить название месяца
print("n=== Используйте dt.month_name(), чтобы получить названия месяцев ===")
month_names = datetime_series.dt.month_name()
print(month_names)

# 4. Китайские названия месяцев (требуется локализация)
print("n=== Сокращения месяцев ===")
month_abbrev = datetime_series.dt.month_name().str[:3]
print(month_abbrev)

Вывод:

=== 创建日期时间 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

Пояснение к коду:

  1. dt.monthВозвращает целые числа от 1 до 12, где 1 обозначает январь, а 12 — декабрь.
  2. dt.month_name()Возвращает полное английское название месяца.
  3. Сокращения месяцев можно получить с помощью среза строки.

Пример 2: Фильтрация и группировка по месяцам

Пример

import pandas as pd
import numpy as np

# Создать данные о продажах
print("=== Создание данных о продажах ===")
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)
})

# Извлечь месяц
df['month'] = df['order_date'].dt.month
print(df.head(10))

# Фильтрация по месяцу - фильтрация данных за Q1
print("n=== Фильтрация заказов за Q1 (янв-мар) ===")
q1_orders = df[df['month'].isin([1, 2, 3])]
print(q1_orders)

# Группировка по месяцу и агрегация
print("n=== Статистика продаж по месяцам ===")
monthly_sales = df.groupby('month')['sales'].agg(['sum', 'mean', 'count'])
monthly_sales.columns = ['Total sales', 'Average sales', 'Количество заказов']
print(monthly_sales)

# Группировка по сезону (с использованием простого сопоставления)
def get_season(month):
    if month in [3, 4, 5]:
        return 'Весна'
    elif month in [6, 7, 8]:
        return 'Лето'
    elif month in [9, 10, 11]:
        return 'Осень'
    else:
        return 'Зима'

print("n=== Статистика по сезонам ===")
df['season'] = df['month'].apply(get_season)
season_stats = df.groupby('season')['sales'].sum()
print(season_stats)

Вывод:

=== 创建销售数据 ===
     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

Пояснение к коду:

  • dt.monthВозвращает целые числа 1-12, что упрощает числовое сравнение и группировку.
  • Месяцы можно сопоставлять с сезонами с помощью пользовательских функций для сезонного анализа.
  • isin([1,2,3])Позволяет удобно фильтровать конкретные месяцы.

Пример 3: Анализ сводной таблицы по месяцам

Пример

import pandas as pd
import numpy as np

# Создать многолетние данные по месяцам
print("=== Создать многолетние данные по месяцам ===")
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))

# Сводная таблица: выручка по годам и месяцам
print("n=== Сводная таблица: выручка по годам и месяцам ===")
pivot = df.pivot_table(
    values='revenue',
    index='month',
    columns='year',
    aggfunc='sum'
)
print(pivot)

# Рассчитать темп роста год к году
print("n=== Темп роста год к году ===")
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']])

# Анализ тенденций по месяцам
print("n=== Средняя месячная выручка (по годам) ===")
monthly_avg = df.groupby('month')['revenue'].mean().round(2)
print(monthly_avg)

# Найти месяцы с самой высокой и самой низкой выручкой
print(f"n=== Пиковый месяц и месяц с минимальной выручкой ===")
print(f"Пиковый месяц: {monthly_avg.idxmax()} месяц, выручка {monthly_avg.max():,.0f}")
print(f"Месяц с минимальной выручкой: {monthly_avg.idxmin()} месяц, выручка {monthly_avg.min():,.0f}")

Вывод:

=== 创建多年月度数据 ===
   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

Пояснение к коду:

  • Сводная таблица (pivot_table) позволяет удобно анализировать пересечение нескольких лет и месяцев.
  • Вы можете рассчитать темп роста год к году для анализа временных рядов.
  • idxmax()иidxmin()Вы можете быстро найти месяц, соответствующий максимальному или минимальному значению.

Примечания

Важные замечания:

  • Series.dt.monthЕго можно использовать только для Series типа datetime64.
  • Возвращаемый диапазон месяцев — 1-12, где 1 обозначает январь, а 12 — декабрь.
  • Если вам нужно название месяца, используйтеdt.month_name()метод.
  • При обработке данных, содержащих пропущенные значения (NaT),dt.monthон возвращает NaT в соответствующих позициях.

Pandas 常用函数Pandas: общие функции

Другие расширения