Pandas Series.dt.year 属性
Series.dt.year 是 Pandas 中用于提取日期时间的年份的属性。它是 dt 访问器的一部分,可以从 datetime 类型的 Series 中快速提取年份信息。
在时间序列数据分析中,经常需要按年份进行分组、筛选或聚合操作。dt.year 属性使得这类操作变得简单高效。
单词释义: year 意为"年份",即返回日期中的年份部分。
基本语法与参数
Series.dt.year 是 Series 的 dt 访问器的一个属性,用于提取年份。
语法格式
Series.dt.year
参数说明
此属性不需要任何参数,直接访问 datetime Series 的年份信息。
返回值说明
- 返回值: 返回一个包含年份的整数 Series。
- 效果: 从 datetime64 类型的 Series 中提取年份部分,返回 4 位整数。
实例
让我们通过一系列从简单到复杂的例子,彻底掌握 Series.dt.year 的用法。
示例 1:基础用法 - 提取年份
实例
import pandas as pd
# 1. 创建日期时间的 Series
print("=== 创建日期时间 Series ===")
dates = pd.Series([
'2023-01-15',
'2023-05-20',
'2022-11-30',
'2021-07-10',
'2024-03-25'
])
# 转换为 datetime 类型
datetime_series = pd.to_datetime(dates)
print("原始日期:")
print(datetime_series)
# 2. 使用 dt.year 提取年份
print("n=== 使用 dt.year 提取年份 ===")
years = datetime_series.dt.year
print("年份:")
print(years)
print(f"类型: {years.dtype}")
# 3. 直接从 datetime Series 访问
print("n=== 直接链式调用 ===")
years_direct = pd.to_datetime(dates).dt.year
print(years_direct)
# 1. 创建日期时间的 Series
print("=== 创建日期时间 Series ===")
dates = pd.Series([
'2023-01-15',
'2023-05-20',
'2022-11-30',
'2021-07-10',
'2024-03-25'
])
# 转换为 datetime 类型
datetime_series = pd.to_datetime(dates)
print("原始日期:")
print(datetime_series)
# 2. 使用 dt.year 提取年份
print("n=== 使用 dt.year 提取年份 ===")
years = datetime_series.dt.year
print("年份:")
print(years)
print(f"类型: {years.dtype}")
# 3. 直接从 datetime Series 访问
print("n=== 直接链式调用 ===")
years_direct = pd.to_datetime(dates).dt.year
print(years_direct)
运行结果:
=== 创建日期时间 Series === 0 2023-01-15 1 2023-05-20 2 2022-11-30 3 2021-07-10 4 2024-03-25 dtype: datetime64[ns] === 使用 dt.year 提取年份 === 年份: 0 2023 1 2023 2 2022 3 2021 4 2024 dtype: int64 === 直接链式调用 === 0 2023 1 2023 2 2022 3 2021 4 2024 dtype: int64
代码解析:
- 首先需要将 Series 转换为 datetime64 类型,然后才能使用 dt 访问器。
dt.year返回的是整数类型的 Series,每行对应原日期的年份。- 可以链式调用,实现一步到位转换和提取。
示例 2:按年份筛选数据
实例
import pandas as pd
import numpy as np
# 创建销售数据
print("=== 销售数据示例 ===")
df = pd.DataFrame({
'order_id': [f'ORD-{i:04d}' for i in range(1, 11)],
'order_date': pd.date_range('2022-01-01', periods=10, freq='MS'),
'sales': [1200, 1500, 1800, 2100, 1900, 2300, 2500, 2800, 3100, 3500]
})
print(df)
# 提取年份
print("n=== 添加年份列 ===")
df['year'] = df['order_date'].dt.year
print(df)
# 按年份筛选
print("n=== 筛选 2023 年的订单 ===")
orders_2023 = df[df['year'] == 2023]
print(orders_2023)
# 按年份分组统计
print("n=== 按年份统计销售额 ===")
yearly_sales = df.groupby('year')['sales'].sum()
print(yearly_sales)
# 多个年份筛选
print("n=== 筛选 2022 和 2024 年的订单 ===")
selected_years = df[df['year'].isin([2022, 2024])]
print(selected_years)
import numpy as np
# 创建销售数据
print("=== 销售数据示例 ===")
df = pd.DataFrame({
'order_id': [f'ORD-{i:04d}' for i in range(1, 11)],
'order_date': pd.date_range('2022-01-01', periods=10, freq='MS'),
'sales': [1200, 1500, 1800, 2100, 1900, 2300, 2500, 2800, 3100, 3500]
})
print(df)
# 提取年份
print("n=== 添加年份列 ===")
df['year'] = df['order_date'].dt.year
print(df)
# 按年份筛选
print("n=== 筛选 2023 年的订单 ===")
orders_2023 = df[df['year'] == 2023]
print(orders_2023)
# 按年份分组统计
print("n=== 按年份统计销售额 ===")
yearly_sales = df.groupby('year')['sales'].sum()
print(yearly_sales)
# 多个年份筛选
print("n=== 筛选 2022 和 2024 年的订单 ===")
selected_years = df[df['year'].isin([2022, 2024])]
print(selected_years)
运行结果:
=== 销售数据示例 ===
order_id order_date sales
0 ORD-0001 2022-01-01 1200
1 ORD-0002 2022-02-01 1500
2 ORD-0003 2022-03-01 1800
3 ORD-0004 2022-04-01 2100
4 ORD-0005 2022-05-01 1900
5 ORD-0006 2022-06-01 2300
6 ORD-0007 2022-07-01 2500
7 ORD-0008 2022-08-01 2800
8 ORD-0009 2022-09-01 3100
9 ORD-0010 2022-10-01 3500
=== 添加年份列 ===
order_id order_date sales year
0 ORD-0001 2022-01-01 1200 2022
1 ORD-0002 2022-02-01 1500 2022
2 ORD-0003 2022-03-01 1800 2022
3 ORD-0004 2022-04-01 2100 2022
4 ORD-0005 2022-05-01 1900 2022
5 ORD-0006 2022-06-01 2300 2022
6 ORD-0007 2022-07-01 2500 2022
7 ORD-0008 2022-08-01 2800 2022
8 ORD-0009 2022-09-01 3100 2022
9 ORD-0010 2022-10-01 3500 2022
=== 筛选 2023 年的订单 ===
Empty DataFrame
Columns: [order_id, order_date, sales, year]
Index: []
=== 按年份统计销售额 ===
year
2022 22900
Name: sales, dtype: int64
=== 筛选 2022 和 2024 年的订单 ===
order_id order_date sales year
0 ORD-0001 2022-01-01 1200 2022
1 ORD-0002 2022-02-01 1500 2022
2 ORD-0003 2022-03-01 1800 2022
3 ORD-0004 2022-04-01 2100 2022
4 ORD-0005 2022-05-01 1900 2022
5 ORD-0006 2022-06-01 2300 2022
6 ORD-0007 2022-07-01 2500 2022
7 ORD-0008 2022-08-01 2800 2022
8 ORD-0009 2022-09-01 3100 2022
9 ORD-0010 2022-10-01 3500 2022
代码解析:
- 年份提取后可以像普通数值列一样进行筛选、分组等操作。
isin()可以筛选多个年份。- 支持比较运算符(>、=、<=)进行范围筛选。
示例 3:年份相关分析
实例
import pandas as pd
import numpy as np
# 创建更复杂的数据集
print("=== 创建包含多年数据的数据集 ===")
np.random.seed(42)
# 生成5年的数据
dates = pd.date_range('2020-01-01', '2024-12-31', freq='D')
df = pd.DataFrame({
'date': dates,
'temperature': np.random.uniform(10, 35, len(dates)),
'sales': np.random.randint(100, 500, len(dates))
})
# 提取年份
df['year'] = df['date'].dt.year
print(f"数据集大小: {len(df)} 条记录")
print(f"年份范围: {df['year'].min()} - {df['year'].max()}")
# 按年份统计
print("n=== 按年份统计 ===")
yearly_stats = df.groupby('year').agg({
'temperature': ['mean', 'min', 'max'],
'sales': ['sum', 'mean', 'count']
}).round(2)
yearly_stats.columns = ['_'.join(col).strip() for col in yearly_stats.columns.values]
print(yearly_stats)
# 每年每月的数据量
print("n=== 各年各月记录数 ===")
df['month'] = df['date'].dt.month
monthly_counts = df.groupby(['year', 'month']).size().unstack(fill_value=0)
print(monthly_counts)
import numpy as np
# 创建更复杂的数据集
print("=== 创建包含多年数据的数据集 ===")
np.random.seed(42)
# 生成5年的数据
dates = pd.date_range('2020-01-01', '2024-12-31', freq='D')
df = pd.DataFrame({
'date': dates,
'temperature': np.random.uniform(10, 35, len(dates)),
'sales': np.random.randint(100, 500, len(dates))
})
# 提取年份
df['year'] = df['date'].dt.year
print(f"数据集大小: {len(df)} 条记录")
print(f"年份范围: {df['year'].min()} - {df['year'].max()}")
# 按年份统计
print("n=== 按年份统计 ===")
yearly_stats = df.groupby('year').agg({
'temperature': ['mean', 'min', 'max'],
'sales': ['sum', 'mean', 'count']
}).round(2)
yearly_stats.columns = ['_'.join(col).strip() for col in yearly_stats.columns.values]
print(yearly_stats)
# 每年每月的数据量
print("n=== 各年各月记录数 ===")
df['month'] = df['date'].dt.month
monthly_counts = df.groupby(['year', 'month']).size().unstack(fill_value=0)
print(monthly_counts)
运行结果:
=== 创建包含多年数据的数据集 ===
数据集大小: 1826 条记录
年份范围: 2020 - 2024
=== 按年份统计 ===
temperature_mean temperature_min temperature_max sales_sum sales_mean sales_count
year
2020 22.47 10.06 34.74 98500 266.31 366
2021 22.56 10.08 34.83 99500 272.60 365
2022 22.43 10.01 34.90 100100 274.11 365
2023 22.53 10.00 34.95 100600 275.62 365
2024 15.90 10.03 34.83 27500 268.93 102
=== 各年各月记录数 ===
month 1 2 3 4 5 6 7 8 9 10 11 12
year
2020 31 29 31 30 31 30 31 31 30 31 30 31
2021 31 28 31 30 31 30 31 31 30 31 30 31
2022 31 28 31 30 31 30 31 31 30 31 30 31
2023 31 28 31 30 31 30 31 31 30 31 30 31
2024 31 29 31 30 31 30 31 31 30 31 30 31
代码解析:
- 通过
groupby().agg()可以按年份进行多维度统计。 groupby(['year', 'month']).size().unstack()可以创建年份和月份的交叉统计表。- 2024 年数据只有 102 条是因为数据生成到 2024 年 4 月(当前日期之前)。
注意事项
重要提示:
Series.dt.year只能用于 datetime64 类型的 Series。- 如果 Series 不是 datetime 类型,需要先用
pd.to_datetime()转换。- 提取的年份是 4 位整数,可以直接用于数值运算和比较。
- 处理包含缺失值(NaT)的数据时,
dt.year会返回对应位置的 NaT。

Pandas 常用函数