Атрибут Pandas Series.dt.weekday
Series.dt.weekdayиспользуется в Pandas для того, чтобыизвлечь день недели, соответствующий дате.Он является частью аксессора dt и возвращает целое число, представляющее день недели (0=понедельник, 6=воскресенье).
В анализе данных временных рядов день недели является важным измерением, например, при анализе различий между выходными и буднями, недельных моделей продаж и т. д.dt.weekdayЭтот атрибут делает такой анализ простым и эффективным.
Значение слова: weekdayОн означает "weekday" или "день недели" и возвращает целочисленное значение от 0 до 6.
Базовый синтаксис и параметры
Series.dt.weekdayЭто атрибут аксессора dt объекта Series, используемый для извлечения дня недели.
Формат синтаксиса
Series.dt.weekday
Описание параметра
Этот атрибут не требует никаких параметров; он напрямую обращается к информации о дне недели для Series с типом datetime.
Описание возвращаемого значения
- Возвращаемое значение: Возвращает целочисленный Series (0-6), содержащий день недели.
- Действие: Возвращает целое число от 0 до 6, где 0 обозначает понедельник, 1 — вторник, ..., 6 — воскресенье.
Примеры
Давайте с помощью серии примеров от простых к сложным основательно освоимSeries.dt.weekdayиспользование.
Пример 1: Базовое использование — извлечение дня недели
Пример
# 1. Создайте Series с datetime
print("=== Создание Series типа datetime ===")
dates = pd.Series([
'2023-01-02', # Понедельник
'2023-01-03', # Вторник
'2023-01-04', # Среда
'2023-01-05', # Четверг
'2023-01-06', # Пятница
'2023-01-07', # Суббота
'2023-01-08', # Воскресенье
])
# Преобразование в тип datetime
datetime_series = pd.to_datetime(dates)
print("Исходные даты:")
print(datetime_series)
# 2. Используйте dt.weekday для извлечения дня недели
print("n=== Использование dt.weekday для извлечения дня недели ===")
weekdays = datetime_series.dt.weekday
print("День недели (0=понедельник, 6=воскресенье):")
print(weekdays)
# 3. Используйте dt.day_name() для получения названия дня недели
print("n=== Использование dt.day_name() для получения названий дней недели ===")
weekday_names = datetime_series.dt.day_name()
print(weekday_names)
# 4. Используйте dt.day_name(locale='zh_CN') для получения названий дней недели на китайском (если доступно)
# Примечание: китайская локализация может потребовать соответствующей настройки
weekday_abbrev = datetime_series.dt.day_name().str[:3]
print("n=== Сокращения дней недели ===")
print(weekday_abbrev)
# 5. Создайте более интуитивно понятную таблицу сравнения
print("n=== Таблица сравнения дат и дней недели ===")
result = pd.DataFrame({
'Дата': datetime_series.dt.date,
'значение дня недели': weekdays,
'Название дня недели': weekday_names
})
print(result)
Вывод:
=== 创建日期时间 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
Пояснение к коду:
dt.weekdayВозвращает целое число от 0 до 6, где 0 обозначает понедельник, а 6 — воскресенье.dt.day_name()Возвращает полное английское название дня недели.- Вы можете получить сокращения с помощью срезов строк (например, 'Mon', 'Tue').
Пример 2: Различение будних дней и выходных
Пример
import numpy as np
# Создайте данные о транзакциях
print("=== Создание данных транзакций ===")
np.random.seed(100)
# Сгенерировать данные за 35 дней (включая несколько выходных)
dates = pd.date_range('2023-03-01', periods=35, freq='D')
df = pd.DataFrame({
'date': даты,
'sales': np.random.randint(1000, 5000, 35)
})
# Извлечь день недели
df['weekday'] = df['date'].dt.weekday
df['day_name'] = df['date'].dt.day_name()
# Отметить будние дни и выходные
df['is_weekend'] = df['weekday'].isin([5, 6])
df['day_type'] = df['is_weekend'].map({True: 'Выходной', False: 'Будний'})
print(df.head(15))
# Сгруппировать статистику по будням/выходным
print("n=== Сравнение продаж в будни и выходные ===")
day_type_stats = df.groupby('day_type')['sales'].agg(['sum', 'mean', 'count'])
day_type_stats.columns = ['Общие продажи', 'Средние продажи', 'Дни']
print(day_type_stats)
# Подробная статистика по каждому дню
print("n=== Статистика продаж по дням недели ===")
weekday_stats = df.groupby('weekday')['sales'].agg(['sum', 'mean'])
weekday_stats.index = ['Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота', 'Воскресенье']
weekday_stats.columns = ['Общие продажи', 'Средние продажи']
print(weekday_stats.round(2))
# Фильтрация данных для всех выходных
print("n=== Данные по выходным ===")
weekend_data = df[df['is_weekend']][['date', 'day_name', 'sales']]
print(weekend_data)
Вывод:
=== 创建交易数据 ===
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
Пояснение к коду:
isin([5, 6])Вы можете определить, является ли это выходным (суббота=5, воскресенье=6).- Данные за будни и выходные часто показывают значительные различия, что является важным измерением в бизнес-анализе.
groupby().agg()Вы можете выполнить групповую статистику по дню недели.
Пример 3: Углублённый анализ недельных закономерностей
Пример
import numpy as np
# Создание более длинного набора данных
print("=== Создание набора данных за 90 дней ===")
np.random.seed(200)
# Сгенерировать данные за 90 дней
dates = pd.date_range('2023-01-01', periods=90, freq='D')
df = pd.DataFrame({
'date': даты,
'visitors': np.random.randint(100, 1000, 90),
'revenue': np.random.randint(5000, 30000, 90)
})
# Извлечь признаки дня недели
df['weekday'] = df['date'].dt.weekday
df['is_weekend'] = df['weekday'].isin([5, 6])
# 1. Рассчитать среднюю эффективность для каждого дня недели
print("=== Анализ эффективности по дням недели ===")
weekday_analysis = df.groupby('weekday').agg({
'visitors': 'mean',
'revenue': 'mean'
}).round(2)
weekday_analysis.index = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
weekday_analysis.columns = ['Average Visitors', 'Average Revenue']
print(weekday_analysis)
# 2. Определить самые загруженные и самые спокойные дни недели
print("n=== Самые загруженные и самые спокойные дни недели ===")
best_day = weekday_analysis['Average Revenue'].idxmax()
worst_day = weekday_analysis['Average Revenue'].idxmin()
print(f"Максимальная выручка: {best_day}, среднее {weekday_analysis.loc[best_day, 'Average Revenue']:,.0f}")
print(f"Минимальная выручка: {worst_day}, среднее {weekday_analysis.loc[worst_day, 'Average Revenue']:,.0f}")
# 3. Сравнение будних дней и выходных
print("n=== Подробное сравнение будних дней и выходных ===")
weekend_comparison = df.groupby('is_weekend').agg({
'visitors': ['mean', 'std', 'sum'],
'revenue': ['mean', 'std', 'sum']
}).round(2)
weekend_comparison.index = ['Будни', 'Выходные']
print(weekend_comparison)
# 4. Отметить тип дня
print("n=== Отметить тип дня ===")
def get_day_type(weekday):
if weekday < 5:
return &'Будний день'
elif weekday == 5:
return &'Суббота'
else:
return &'Воскресенье'
df['day_category'] = df['weekday'].apply(get_day_type)
# Недельный тренд
print("n===Недельный тренд выручки===")
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())
Вывод:
=== 创建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
Пояснение к коду:
- В среду наблюдается самая высокая средняя выручка, тогда как в воскресенье — самая низкая средняя выручка.
- Общие показатели в будние дни лучше, чем в выходные, и это стоит отметить в бизнес-анализе.
- Вы можете использовать
pivot_tableдля анализа изменений тенденций разных дней недели в разных неделях.
Примечания
Важные замечания:
Series.dt.weekdayМожно использовать только с Series с dtype datetime64.- Диапазон возвращаемых значений — 0-6, где 0 соответствует понедельнику, а 6 — воскресенью.
- Если вам нужно название дня недели, используйте
dt.day_name()метод.- При обработке данных, содержащих пропущенные значения (NaT),
dt.weekdayон вернёт NaT в соответствующих позициях.- Примечание:
weekdayАтрибут эквивалентенdayofweekатрибуту; они эквивалентны, различаются только названия.
Другие расширения
Pandas: общие функции