Свойство Pandas Series.dt.month
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: Базовое использование - извлечение месяца
Пример
# 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
Пояснение к коду:
dt.monthВозвращает целые числа от 1 до 12, где 1 обозначает январь, а 12 — декабрь.dt.month_name()Возвращает полное английское название месяца.- Сокращения месяцев можно получить с помощью среза строки.
Пример 2: Фильтрация и группировка по месяцам
Пример
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 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: общие функции