Атрибут Pandas Series.dt.year
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: Базовое использование — извлечение года
Пример
# 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
Анализ кода:
- Сначала необходимо преобразовать Series в тип datetime64, прежде чем использовать аксессор dt.
dt.yearВозвращаемый Series имеет целочисленный тип, при этом каждая строка соответствует году из исходной даты.- Цепочки вызовов можно использовать для одношагового преобразования и извлечения.
Пример 2: Фильтрация данных по году
Пример
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 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: общие функции