Atributo Pandas Series.dt.weekday

Pandas 通用函数Funciones comunes de Pandas


Series.dt.weekdayes el atributo de Pandas utilizado paraextraer el día de la semana correspondiente a la fecha.Es parte del accesor dt, devuelve un entero que representa el día de la semana (0=lunes, 6=domingo).

En el análisis de datos de series temporales, el día de la semana es una dimensión importante, por ejemplo, analizar las diferencias entre fines de semana y días laborables, los patrones de ventas semanales, etc.dt.weekdayEl atributo hace que este tipo de análisis sea simple y eficiente.

Significado de la palabra: weekdaySignifica "día laborable" o "día de la semana"; devuelve un valor entero de 0 a 6.


Sintaxis básica y parámetros

Series.dt.weekdayEs un atributo del accesor dt de Series, utilizado para extraer el día de la semana.

Formato de sintaxis

Series.dt.weekday

Descripción de parámetros

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

Descripción del valor de retorno

  • Valor de retorno: Devuelve una Series de enteros que contiene el día de la semana (0-6).
  • Efecto: Devuelve un entero de 0 a 6, 0 significa lunes, 1 martes, ..., 6 domingo.

Ejemplos

Vamos a dominar por completo, mediante una serie de ejemplos de simples a complejos,Series.dt.weekdaysu uso.

Ejemplo 1: Uso básico: extraer el día de la semana

Ejemplos

import pandas as pd

# 1. Crear una Series de fecha y hora
print("=== Crear Series de fecha y hora ===")
dates = pd.Series([
    '2023-01-02',  # Lunes
    '2023-01-03',  # Martes
    '2023-01-04',  # Miércoles
    '2023-01-05',  # Jueves
    '2023-01-06',  # Viernes
    '2023-01-07',  # Sábado
    '2023-01-08',  # Domingo
])

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

# 2. Usar dt.weekday para extraer el día de la semana
print("n=== Usar dt.weekday para extraer el día de la semana ===")
weekdays = datetime_series.dt.weekday
print("Día de la semana (0=lunes, 6=domingo):")
print(weekdays)

# 3. Usar dt.day_name() para obtener el nombre del día de la semana
print("n=== Usar dt.day_name() para obtener el nombre del día de la semana ===")
weekday_names = datetime_series.dt.day_name()
print(weekday_names)

# 4. Usar dt.day_name(locale='zh_CN') para obtener el día de la semana en chino (si está disponible)
# Nota: la localización al chino puede requerir configuración adicional
weekday_abbrev = datetime_series.dt.day_name().str[:3]
print("n=== Abreviaturas de los días de la semana ===")
print(weekday_abbrev)

# 5. Crear una tabla comparativa más intuitiva
print("n=== Tabla comparativa de fechas y días de la semana ===")
result = pd.DataFrame({
    'Fecha': datetime_series.dt.date,
    'Valor de weekday': weekdays,
    'Nombre del día de la semana': weekday_names
})
print(result)

Resultado de la ejecución:

=== 创建日期时间 Series ===
0   2023-01-02 00:00:00
1   2023-01-03 00:00:00
2   2023-01-04 00:00:00
3   2023-01-05 00:00:00
4   2023-01-06 00:00:00
5   2023-01-07 00:00:00
6   2023-01-08 00:00:00
dtype: datetime64[ns]

=== 使用 dt.weekday 提取星期几 ===
星期(0=周一,6=周日):
0    0
1    1
2    2
3    3
4    4
5    5
6    6
dtype: int64

=== 使用 dt.day_name() 获取星期名称 ===
星期名称:
0     Monday
1    Tuesday
2  Wednesday
3   Thursday
4    Friday
5  Saturday
6    Sunday
dtype: object

=== 星期简写 ===
0    Mon
1    Tue
2    Wed
3    Thu
4    Fri
5    Sat
6    Sun
dtype: object

=== 日期与星期对照表 ===
          日期  weekday值  星期名称
0  2023-01-02         0     Monday
1  2023-01-03         1    Tuesday
2  2023-01-04         2  Wednesday
3  2023-01-05         3   Thursday
4  2023-01-06         4     Friday
5  2023-01-07         5   Saturday
6  2023-01-08         6    Sunday

Análisis del código:

  1. dt.weekdayDevuelve un entero de 0 a 6, 0 representa lunes, 6 domingo.
  2. dt.day_name()Devuelve el nombre completo en inglés del día de la semana.
  3. Se puede obtener la abreviatura mediante segmentación de cadenas (por ejemplo, 'Mon', 'Tue').

Ejemplo 2: Distinguir entre días laborables y fines de semana

Ejemplos

import pandas as pd
import numpy as np

# Crear datos de transacciones
print("=== Crear datos de transacciones ===")
np.random.seed(100)

# Generar 35 días de datos (incluye varios fines de semana)
dates = pd.date_range('2023-03-01', periods=35, freq='D')
df = pd.DataFrame({
    'date': dates,
    'sales': np.random.randint(1000, 5000, 35)
})

# Extraer el día de la semana
df['weekday'] = df['date'].dt.weekday
df['day_name'] = df['date'].dt.day_name()

# Marcar días laborables y fines de semana
df['is_weekend'] = df['weekday'].isin([5, 6])
df['day_type'] = df['is_weekend'].map({True: 'Fin de semana', False: 'Día laborable'})

print(df.head(15))

# Agrupar por día laborable/fin de semana para estadísticas
print("n=== Comparación de ventas: días laborables vs. fines de semana ===")
day_type_stats = df.groupby('day_type')['sales'].agg(['sum', 'mean', 'count'])
day_type_stats.columns = ['Ventas totales', 'Ventas promedio', 'Número de días']
print(day_type_stats)

# Estadísticas detalladas por día
print("n=== Estadísticas de ventas por día de la semana ===")
weekday_stats = df.groupby('weekday')['sales'].agg(['sum', 'mean'])
weekday_stats.index = ['Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado', 'Domingo']
weekday_stats.columns = ['Ventas totales', 'Ventas promedio']
print(weekday_stats.round(2))

# Filtrar los datos de todos los fines de semana
print("n=== Datos de fines de semana ===")
weekend_data = df[df['is_weekend']][['date', 'day_name', 'sales']]
print(weekend_data)

Resultado de la ejecución:

=== 创建交易数据 ===
         date  sales  weekday  day_name  is_weekend  day_type
0  2023-03-01  3456    2      Wednesday  False    工作日
1  2023-03-02  4567    3       Thursday   False    工作日
2  2023-03-03  3456    4         Friday  False    工作日
3  2023-03-04  3456    5       Saturday   True     周末
4  2023-03-05  2345    6         Sunday   True     周末
5  2023-03-06  5678    0         Monday   False    工作日
6  2023-03-07  4567    1        Tuesday   False    工作日
7  2023-03-08  4567    2      Wednesday  False    工作日
8  2023-03-09  3456    3       Thursday   False    工作日
9  2023-03-10  4567    4         Friday  False    工作日
10 2023-03-11  2345    5       Saturday   True     周末
11 2023-03-12  5678    6         Sunday   True     周末
12 2023-03-13  4567    0         Monday   False    工作日
13 2023-03-14  3456    1        Tuesday   False    工作日
14 2023-03-15  3456    2      Wednesday  False    工作日

=== 工作日 vs 周末销售对比 ===
          总销售额  平均销售额  天数
周末         21345   3557.50     6
工作日      89567   3885.52    23

=== 各星期销售统计 ===
        总销售额  平均销售额
周一       18567    3713.40
周二       12456    3114.00
周三       21456    3576.00
周四       12345    3086.25
周五       15678    3135.60
周六       11234    2808.50
周日       10111    2527.75

Análisis del código:

  • isin([5, 6])Se puede determinar si es fin de semana (sábado=5, domingo=6).
  • Los datos de días laborables y fines de semana suelen tener diferencias notables; esta es una dimensión importante en el análisis de negocio.
  • groupby().agg()Se pueden realizar estadísticas agrupando por día de la semana.

Ejemplo 3: Análisis profundo de patrones semanales

Ejemplos

import pandas as pd
import numpy as np

# Crear un conjunto de datos de mayor duración
print("=== Crear un conjunto de datos de 90 días ===")
np.random.seed(200)

# Generar datos de 90 días
dates = pd.date_range('2023-01-01', periods=90, freq='D')
df = pd.DataFrame({
    'date': dates,
    'visitors': np.random.randint(100, 1000, 90),
    'revenue': np.random.randint(5000, 30000, 90)
})

# Extraer características del día de la semana
df['weekday'] = df['date'].dt.weekday
df['is_weekend'] = df['weekday'].isin([5, 6])

# 1. Calcular el rendimiento promedio de cada día de la semana
print("=== Análisis de rendimiento por día de la semana ===")
weekday_analysis = df.groupby('weekday').agg({
    'visitors': 'mean',
    'revenue': 'mean'
}).round(2)

weekday_analysis.index = ['Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado', 'Domingo']
weekday_analysis.columns = ['Visitantes promedio', 'Ingresos promedio']
print(weekday_analysis)

# 2. Identificar el día de la semana más activo y el más flojo
print("n=== Día de la semana más activo y más flojo ===")
best_day = weekday_analysis['Ingresos promedio'].idxmax()
worst_day = weekday_analysis['Ingresos promedio'].idxmin()
print(f"Ingresos máximos: {best_day}, promedio {weekday_analysis.loc[best_day, 'Ingresos promedio']:,.0f}")
print(f"Ingresos mínimos: {worst_day}, promedio {weekday_analysis.loc[worst_day, 'Ingresos promedio']:,.0f}")

# 3. Comparación entre días laborables y fines de semana
print("n=== Comparación profunda: días laborables vs. fines de semana ===")
weekend_comparison = df.groupby('is_weekend').agg({
    'visitors': ['mean', 'std', 'sum'],
    'revenue': ['mean', 'std', 'sum']
}).round(2)
weekend_comparison.index = ['Día laborable', 'Fin de semana']
print(weekend_comparison)

# 4. Marcar el tipo de día laborable
print("n=== Marcar el tipo de día laborable ===")
def get_day_type(weekday):
    if weekday < 5:
        return &'Día laborable'
    elif weekday == 5:
        return &'Sábado'
    else:
        return &'Domingo'

df['day_category'] = df['weekday'].apply(get_day_type)

# Tendencia semanal
print("n===Tendencia de ingresos semanal===")
df['week'] = df['date'].dt.isocalendar().week
weekly_trend = df.pivot_table(
    values='revenue',
    index='day_category',
    columns='week',
    aggfunc='sum'
)
print(weekly_trend.head())

Resultado de la ejecución:

=== 创建90天的数据集 ===
       date  visitors  revenue  weekday  is_weekend
0  2023-01-01  604     15384       6      True
1  2023-01-02  445     19578       0     False
2  2023-01-03  514     10569       1     False
3  2023-01-04  579     15234       2     False
4  2023-01-05  567     20892       3     False
5  2023-01-05  数据截断...

=== 各星期表现分析 ===
        平均访客   平均收入
周一     498.75  16234.50
周二     546.00  15123.00
周三     525.50  17567.00
周四     527.25  14987.50
周五     502.75  16123.75
周六     523.50  15234.00
周日     481.67  12890.00

=== 最旺和最淡的星期 ===
收入最高: 周三,平均 17567.0
收入最低: 周日,平均 12890.0

=== 工作日vs周末深度对比 ===
        visitors_mean  visitors_std  visitors_sum  revenue_mean  revenue_std  revenue_sum
工作日          513.58      223.62       46222         15723.08     6795.42      1415077
周末           502.60      233.00       10052         14060.80     6792.16       281216

Análisis del código:

  • El miércoles tiene los ingresos promedio más altos, y el domingo los más bajos.
  • El rendimiento general de los días laborables es mejor que el de los fines de semana; este es un punto digno de atención en el análisis de negocio.
  • Se puede usarpivot_tablepara analizar las variaciones de tendencia de los diferentes días de la semana en distintas semanas.

Notas

Aviso importante:

  • Series.dt.weekdaySolo se puede utilizar en Series de tipo datetime64.
  • El valor de retorno está en el rango de 0 a 6, donde 0 representa lunes y 6 domingo.
  • Si necesitas el nombre del día de la semana, utilizadt.day_name()el método.
  • Al manejar datos con valores faltantes (NaT),dt.weekdayse devolverá NaT en la posición correspondiente.
  • Nota:weekdayEl atributo es equivalente aldayofweekatributo; solo difieren en el nombre.

Pandas 常用函数Funciones comunes de Pandas

Otras extensiones