Атрибут Pandas Series.dt.year

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


Series.dt.yearиспользуется в Pandas дляизвлечения года из даты и времениатрибута. Он является частью аксессора dt и позволяет быстро извлекать информацию о годе из Series типа datetime.

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

Определение слова: yearОзначает "year", т. е. возвращает часть даты, соответствующую году.


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

Series.dt.yearЭто атрибут аксессора dt объекта Series, используемый для извлечения года.

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

Series.dt.year

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

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

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

  • Возвращаемое значение: возвращает целочисленный Series, содержащий год.
  • Действие: извлекает часть года из Series типа datetime64 и возвращает 4-значное целое число.

Примеры

Давайте досконально освоим с помощью серии примеров от простых к сложнымSeries.dt.yearиспользование.

Пример 1: Базовое использование — извлечение года

Пример

import pandas as pd

# 1. Создайте Series с datetime
print("=== Создание Series типа datetime ===")
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.год
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': даты,
    'temperature': np.random.uniform(10, 35, len(dates)),
    'sales': np.random.randint(100, 500, len(dates))
})

# Извлечь год
df['year'] = df['date'].dt.год

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 года (до текущей даты).

Примечания

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

  • Series.dt.yearЕго можно использовать только для Series типа datetime64.
  • Если Series не относится к типу datetime, сначала нужно использоватьpd.to_datetime()для преобразования.
  • Извлечённый год — это 4-значное целое число, и его можно напрямую использовать в числовых операциях и сравнениях.
  • При обработке данных, содержащих пропущенные значения (NaT),dt.yearNaT будет возвращено в соответствующей позиции.

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

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