Propiedad Pandas Series.dt.day

Pandas 通用函数Funciones comunes de Pandas


Series.dt.dayes la propiedad de Pandas utilizada paraextraer el día (fecha) de un datetime.Es parte del accesor dt y puede extraer rápidamente el día del mes (1-31) de una Series de tipo datetime.

En el análisis de datos de series temporales, analizar por día es una necesidad común, por ejemplo, analizar ciertos días de cada mes, identificar patrones periódicos, etc.dt.dayEsta propiedad hace que este tipo de operaciones sea simple y eficiente.

Definición de la palabra: daySignifica "día", es decir, devuelve el día en la fecha (el día del mes).


Sintaxis básica y parámetros

Series.dt.dayEs una propiedad del accesor dt de Series, utilizada para extraer el día.

Formato de sintaxis

Series.dt.day

Descripción de parámetros

Esta propiedad no requiere ningún parámetro; accede directamente a la información del día de la Series datetime.

Descripción del valor de retorno

  • Valor de retornoDevuelve una Series de enteros que contiene los días (1-31).
  • EfectoExtrae la parte del día de la fecha de una Series de tipo datetime64, devolviendo enteros del 1 al 31.

Ejemplos

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

Ejemplo 1: Uso básico - extraer el día

Ejemplo

import pandas as pd

# 1. Crear una Series de fechas y horas
print("=== Crear una Series de fechas y horas ===")
dates = pd.Series([
    '2023-01-15',
    '2023-02-20',
    '2023-03-05',
    '2023-04-30',
    '2023-05-25',
    '2023-12-31'
])

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

# 2. Usar dt.day para extraer el día
print("n=== Usar dt.day para extraer el día ===")
days = datetime_series.dt.day
print("Día:")
print(days)

# 3. Extraer año, mes y día a la vez
print("n=== Extraer año, mes y día a la vez ===")
datetime_series = pd.to_datetime(dates)
df = pd.DataFrame({
    'Fecha original': datetime_series,
    'Año': datetime_series.dt.year,
    'Mes': datetime_series.dt.month,
    'Día': datetime_series.dt.day
})
print(df)

# 4. Ver cuántos días tiene cada mes
print("n=== Días de cada mes ===")
dates_full = pd.date_range('2023-01-01', periods=12, freq='MS')
days_in_month = dates_full.dt.days_in_month
print(pd.DataFrame({
    'Mes': dates_full,
    'Días': days_in_month
}))

# 5. Días de febrero en año bisiesto
print("n=== Días de febrero en año bisiesto ===")
leap_feb = pd.Timestamp('2024-02-01').days_in_month
print(f"Días de febrero de 2024: {leap_feb}")
non_leap_feb = pd.Timestamp('2023-02-01').days_in_month
print(f"Días de febrero de 2023: {non_leap_feb}")

Resultado de la ejecución:

=== 创建日期时间 Series ===
0   2023-01-15
1   2023-02-20
2   2023-03-05
3   2023-04-30
4   2023-05-25
5   2023-12-31
dtype: datetime64[ns]

=== 使用 dt.day 提取天 ===
天:
0    15
1    20
2     5
3    30
4    25
5    31
dtype: int64

=== 同时提取年月日 ===
       原始日期  年  月  日
0 2023-01-15  2023  1  15
1 2023-02-20  2023  2  20
2 2023-03-05  2023  3   5
3 2023-04-30  2023  4  30
4 2023-05-25  2023  5  25
5 2023-12-31  2023 12  31

=== 各月的天数 ===
         月份  天数
0  2023-01-01  31
1  2023-02-01  28
2  2023-03-01  31
3  2023-04-01  30
4  2023-05-01  31
5  2023-06-01  30
6  2023-07-01  31
7  2023-08-01  31
8  2023-09-01  30
9  2023-10-01  31
10 2023-11-01  30
11 2023-12-01  31

=== 闰年2月天数 ===
2024年2月天数: 29
2023年2月天数: 28

Análisis del código:

  1. dt.dayDevuelve enteros del 1 al 31 que representan el día del mes.
  2. Se puede extraer año, mes y día a la vez para crear un nuevo DataFrame.
  3. days_in_monthLa propiedad puede obtener el número de días de cada mes, muy útil para manejar fechas de fin de mes.
  4. El año 2024 es bisiesto, febrero tiene 29 días; 2023 no es bisiesto, febrero tiene 28 días.

Ejemplo 2: Filtrar y analizar por día

Ejemplo

import pandas as pd
import numpy as np

# Crear un conjunto de datos con fechas
print("=== Crear datos de transacciones ===")
np.random.seed(100)

# Generar datos de 30 días
dates = pd.date_range('2023-03-01', periods=30, freq='D')
df = pd.DataFrame({
    'date': dates,
    'transactions': np.random.randint(50, 200, 30),
    'revenue': np.random.randint(5000, 20000, 30)
})

# Extraer el día
df['day'] = df['date'].dt.day
print(df.head(15))

# Filtrar registros de un día específico (por ejemplo, el día 15 de cada mes)
print("n=== Transacciones del día 15 de cada mes ===")
day_15 = df[df['day'] == 15]
print(day_15)

# Filtrar la primera y la segunda mitad del mes
print("n=== Primera mitad vs segunda mitad del mes ===")
df['half'] = df['day'].apply(lambda x: 'Primera mitad' if x <= 15 else 'Segunda mitad')
half_stats = df.groupby('half')['transactions'].agg(['sum', 'mean']).round(2)
half_stats.columns = ['Total de transacciones', 'Promedio de transacciones']
print(half_stats)

# Estadísticas por día
print("n=== Ingreso promedio por día ===")
daily_avg = df.groupby('day')['revenue'].mean().round(2)
print(daily_avg)

# Encontrar el día con mayores ingresos
print("n=== Día con mayor y menor ingreso ===")
max_day = df.loc[df['revenue'].idxmax()]
min_day = df.loc[df['revenue'].idxmin()]
print(f"Mayor ingreso: {max_day['date'].date()}, monto {max_day['revenue']}")
print(f"Menor ingreso: {min_day['date'].date()}, monto {min_day['revenue']}")

Resultado de la ejecución:

=== 创建交易数据 ===
         date  transactions  revenue  day
0  2023-03-01             73  16200    1
1  2023-03-02            163  18800    2
2  2023-03-03             76   9600    3
3  2023-03-04             83  10500    4
4  2023-03-05            136  16200    5
5  2023-03-06             86  11700    6
6  2023-03-07             87  13400    7
7  2023-03-08            168  14200    8
8  2023-03-09            163  15800    9
9  2023-03-10             82  11000   10
10 2023-03-11            106  14600   11
11 2023-03-12            152  15900   12
12 2023-03-13            数据截断...

=== 每月15号的交易 ===
        date  transactions  revenue  day
14  2023-03-15            104  12900   15

=== 上半月 vs 下半月 ===
        总交易数  平均交易数
下半月   2117  111.42
上半月   1873  117.06

=== 按天统计平均收入 ===
day
1     16200.00
2     18800.00
...

=== 收入最高和最低的天 ===
最高收入: 2023-03-02,金额 18800
最低收入: 2023-03-03,金额 9600

Análisis del código:

  • Se puede filtrar y hacer análisis de agrupación por día.
  • Se pueden dividir los días en primera y segunda mitad del mes para el análisis.
  • idxmax()yidxmin()Se pueden encontrar rápidamente los registros correspondientes a los valores extremos.

Ejemplo 3: Manejo de fechas de fin de mes

Ejemplo

import pandas as pd

# 1. Manejar el último día de diferentes meses
print("=== Último día de cada mes ===")
dates = pd.date_range('2023-01-01', periods=12, freq='MS')
print("Primer día de cada mes:")
print(dates)

# Obtener el último día de cada mes
last_days = dates + pd.offsets.MonthEnd(0)
print("nÚltimo día de cada mes:")
print(last_days)

# 2. Determinar si es fin de mes
print("n=== Determinar si es fin de mes ===")
test_dates = pd.Series([
    '2023-01-30',  # 30 de enero (no es fin de mes)
    '2023-01-31',  # 31 de enero (fin de mes)
    '2023-02-28',  # 28 de febrero (año no bisiesto)
    '2023-04-30',  # 30 de abril (fin de mes)
])

dt_series = pd.to_datetime(test_dates)
is_month_end = dt_series.is_month_end

result = pd.DataFrame({
    'Fecha': dt_series,
    'Es fin de mes': is_month_end
})
print(result)

# 3. Manejo de fechas de inicio de mes
print("n=== Determinar si es inicio de mes ===")
is_month_start = dt_series.is_month_start
result['Es inicio de mes'] = is_month_start
print(result)

# 4. Manejo cuando el número de días del mes no coincide
print("n=== Manejo de días inconsistentes en el mes ===")
dates_to_check = pd.Series([
    '2023-01-31',  # Fecha válida
    '2023-02-30',  # Fecha inválida (febrero no tiene 30 días)
])

# Intentar convertir y manejar fechas inválidas
try:
    valid_dates = pd.to_datetime(dates_to_check, errors='coerce')
    print("Fecha convertida:")
    print(valid_dates)
    print("nDía correspondiente a cada fecha:")
    print(valid_dates.dt.day)
except Exception as e:
    print(f"Error: {e}")

Resultado de la ejecución:

=== 各月最后一天 ===
每月第一天:
DatetimeIndex(['2023-01-01', '2023-02-01', '2023-03-01', '2023-04-01',
               '2023-05-01', '2023-06-01', '2023-07-01', '2023-03-01',
               '2023-09-01', '2023-10-01', '2023-11-01', '2023-12-01'],
              dtype='datetime64[ns]', freq=None)

每月最后一天:
DatetimeIndex(['2023-01-31', '2023-02-28', '2023-03-31', '2023-04-30',
               '2023-05-31', '2023-06-30', '2023-07-31', '2023-03-31',
               '2023-09-30', '2023-10-31', '2023-11-30', '2023-12-31'],
              dtype='datetime64[ns]', freq=None)

=== 判断是否为月末 ===
         日期  是否为月末
0 2023-01-30    False
1 2023-01-31     True
2 2023-02-28     True
3 2023-04-30     True

=== 判断是否为月初 ===
         日期  是否为月末  是否为月初
0 2023-01-30    False    False
1 2023-01-31    False    False
2 2023-02-28    False    False
3 2023-04-30    False    False

=== 月份天数不一致的处理 ===
转换后的日期:
0   2023-01-31
1          NaT
Name: date, dtype: datetime64[ns]

各日期对应的天:
0    31.0
1     NaN

Análisis del código:

  • is_month_endLa propiedad puede determinar si es fin de mes.
  • is_month_startLa propiedad puede determinar si es inicio de mes.
  • pd.offsets.MonthEnd(0)Se puede obtener el último día del mes correspondiente.
  • Al manejar fechas inválidas, se puede usarerrors='coerce'para convertir las fechas inválidas a NaT.

Precauciones

Nota importante:

  • Series.dt.daySolo se puede utilizar en Series de tipo datetime64.
  • El rango de días devuelto es 1-31; el valor máximo concreto depende del mes (febrero tiene como máximo 28/29 días; abril, junio, septiembre y noviembre 30 días; los demás meses 31 días).
  • Se puede usardt.days_in_monthpara obtener el número de días de cada mes.
  • Al procesar datos con valores faltantes (NaT),dt.dayse devolverá NaT en la posición correspondiente.

Pandas 常用函数Funciones comunes de Pandas

Otras extensiones