Propiedad Series.dt.year 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
# 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:
- Primero es necesario convertir la Series al tipo `datetime64` y luego se puede usar el accesador `dt`.
dt.yearLo que se devuelve es una Series de tipo entero, donde cada fila corresponde al año de la fecha original.- 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 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 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:
- Mediante
groupby().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 usar
pd.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.
Otras extensiones
Funciones comunes de Pandas