现在位置: 首页 > Pandas 教程 > 正文

Pandas Series.dt.year 属性

Pandas 通用函数 Pandas 常用函数


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)

运行结果:

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

代码解析:

  1. 首先需要将 Series 转换为 datetime64 类型,然后才能使用 dt 访问器。
  2. dt.year 返回的是整数类型的 Series,每行对应原日期的年份。
  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, 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)

运行结果:

=== 创建包含多年数据的数据集 ===
数据集大小: 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 常用函数 Pandas 常用函数