Propiedad Series.dt.year de Pandas

Pandas 通用函数Funciones comunes de Pandas


Series.dt.yeares la propiedad de Pandas que se utiliza paraextraer el año de fechas y horas. Es parte del accesador `dt` y puede extraer rápidamente la información del año de una Series de tipo `datetime`.

En el análisis de datos de series temporales, a menudo es necesario agrupar, filtrar o agregar por año.dt.yearEsta propiedad hace que este tipo de operaciones sea sencillo y eficiente.

Definición de la palabra: yearSignifica "año", es decir, devuelve la parte del año de la fecha.


Sintaxis básica y parámetros

Series.dt.yearEs una propiedad del accesador `dt` de Series, utilizada para extraer el año.

Formato de sintaxis

Series.dt.year

Descripción de parámetros

Esta propiedad no requiere ningún parámetro; accede directamente a la información del año de una Series de tipo `datetime`.

Descripción del valor de retorno

  • Valor de retorno: Devuelve una Series de enteros que contiene el año.
  • Efecto: Extrae la parte del año de una Series de tipo `datetime64` y devuelve un entero de 4 dígitos.

Ejemplos

A través de una serie de ejemplos de simples a complejos, dominaremos por completoSeries.dt.yearsu uso.

Ejemplo 1: Uso básico - Extraer el año

Ejemplos

import pandas as pd

# 1. Crear una Series de fechas y horas
print("=== Crear una Series de fecha y hora ===")
dates = pd.Series([
    '2023-01-15',
    '2023-05-20',
    '2022-11-30',
    '2021-07-10',
    '2024-03-25'
])

# Convertir al tipo datetime
datetime_series = pd.to_datetime(dates)
print("Fechas originales:")
print(datetime_series)

# 2. Usar dt.year para extraer el año
print("n=== Usando dt.year para extraer el año ===")
years = datetime_series.dt.year
print("Año:")
print(years)
print(f"Tipo: {years.dtype}")

# 3. Acceder directamente desde la Series datetime
print("n=== Llamada encadenada directa ===")
years_direct = pd.to_datetime(dates).dt.year
print(years_direct)

Resultado de ejecución:

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

Análisis del código:

  1. Primero es necesario convertir la Series al tipo `datetime64` y luego se puede usar el accesador `dt`.
  2. dt.yearLo que se devuelve es una Series de tipo entero, donde cada fila corresponde al año de la fecha original.
  3. Se puede encadenar la llamada para realizar la conversión y la extracción en un solo paso.

Ejemplo 2: Filtrar datos por año

Ejemplos

import pandas as pd
import numpy as np

# Crear datos de ventas
print("=== Ejemplo de datos de ventas ===")

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)

# Extraer el año
print("n=== Agregar columna de año ===")
df['year'] = df['order_date'].dt.year
print(df)

# Filtrar por año
print("n=== Filtrar pedidos del año 2023 ===")
orders_2023 = df[df['year'] == 2023]
print(orders_2023)

# Agrupar y calcular estadísticas por año
print("n=== Estadísticas de ventas por año ===")
yearly_sales = df.groupby('year')['sales'].sum()
print(yearly_sales)

# Filtrar por varios años
print("n=== Filtrar pedidos de 2022 y 2024 ===")
selected_years = df[df['year'].isin([2022, 2024])]
print(selected_years)

Resultado de ejecución:

=== 销售数据示例 ===
     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

Análisis del código:

  • Después de extraer el año, se puede filtrar, agrupar, etc., como si fuera una columna numérica normal.
  • isin()Se pueden filtrar varios años.
  • Admite operadores de comparación (`>`, `=`, `<=`) para filtrar por rangos.

Ejemplo 3: Análisis relacionado con el año

Ejemplos

import pandas as pd
import numpy as np

# Crear un conjunto de datos más complejo
print("=== Crear un conjunto de datos con varios años ===")
np.random.seed(42)

# Generar 5 años de datos
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))
})

# Extraer el año
df['year'] = df['date'].dt.year

print(f"Tamaño del conjunto de datos: {len(df)} registros")
print(f"Rango de años: {df['year'].min()} - {df['year'].max()}")

# Estadísticas por año
print("n=== Estadísticas por año ===")
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)

# Cantidad de datos por año y mes
print("n=== Número de registros por año y mes ===")
df['month'] = df['date'].dt.month
monthly_counts = df.groupby(['year', 'month']).size().unstack(fill_value=0)
print(monthly_counts)

Resultado de ejecución:

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

Análisis del código:

  • Mediantegroupby().agg()se pueden realizar estadísticas multidimensionales por año.
  • groupby(['year', 'month']).size().unstack()Se puede crear una tabla cruzada de estadísticas por año y mes.
  • Los datos de 2024 solo tienen 102 registros porque los datos se generaron hasta abril de 2024 (antes de la fecha actual).

Notas

Nota importante:

  • Series.dt.yearSolo se puede usar en Series de tipo `datetime64`.
  • Si la Series no es de tipo `datetime`, primero debe usarpd.to_datetime()para convertirla.
  • El año extraído es un entero de 4 dígitos y se puede usar directamente en operaciones numéricas y comparaciones.
  • Al procesar datos que contienen valores faltantes (`NaT`),dt.yearse devolverá `NaT` en la posición correspondiente.

Pandas 常用函数Funciones comunes de Pandas

Otras extensiones