Pandas Series.dt.month 属性
Series.dt.month 是 Pandas 中用于提取日期时间的月份的属性。它是 dt 访问器的一部分,可以从 datetime 类型的 Series 中快速提取月份信息(1-12)。
在时间序列数据分析中,按月份进行分析是常见需求,例如月度报表、季节性分析等。dt.month 属性使得这类操作变得简单高效。
单词释义: month 意为"月份",即返回日期中的月份部分(1到12)。
基本语法与参数
Series.dt.month 是 Series 的 dt 访问器的一个属性,用于提取月份。
语法格式
Series.dt.month
参数说明
此属性不需要任何参数,直接访问 datetime Series 的月份信息。
返回值说明
- 返回值: 返回一个包含月份的整数 Series(1-12)。
- 效果: 从 datetime64 类型的 Series 中提取月份部分,返回 1 到 12 的整数。
实例
让我们通过一系列从简单到复杂的例子,彻底掌握 Series.dt.month 的用法。
示例 1:基础用法 - 提取月份
实例
import pandas as pd
# 1. 创建日期时间的 Series
print("=== 创建日期时间 Series ===")
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)
# 1. 创建日期时间的 Series
print("=== 创建日期时间 Series ===")
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 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))
# 按月份筛选 - 筛选第一季度数据
print("n=== 筛选第一季度(1-3月)的订单 ===")
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 = ['总销售额', '平均销售额', '订单数']
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)
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))
# 按月份筛选 - 筛选第一季度数据
print("n=== 筛选第一季度(1-3月)的订单 ===")
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 = ['总销售额', '平均销售额', '订单数']
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}")
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只能用于 datetime64 类型的 Series。- 返回的月份范围是 1-12,1 代表一月,12 代表十二月。
- 如果需要月份名称,使用
dt.month_name()方法。- 处理包含缺失值(NaT)的数据时,
dt.month会返回对应位置的 NaT。

Pandas 常用函数