【Pandas】pandas Index objects PeriodIndex day_of_week
Pandas2.2 Index objects
PeriodIndex Properties
| 方法 | 描述 |
|---|---|
| PeriodIndex.day | 用于获取 PeriodIndex 中每个周期对应的日(day)组件 |
| PeriodIndex.dayofweek | 用于获取 PeriodIndex 中每个周期对应的星期几 |
| PeriodIndex.day_of_week | 用于获取 PeriodIndex 中每个周期对应日期的星期几(数值形式) |
pandas.PeriodIndex.day_of_week 详解及修正示例
方法描述
pandas.PeriodIndex.day_of_week 是 PeriodIndex 对象的一个属性,用于获取 PeriodIndex 中每个周期对应日期的星期几(数值形式)。需要注意的是,PeriodIndex 必须具有日(daily)或更高频率(如小时、分钟等)才能使用此属性。
返回值
返回一个 Index 对象,包含每个周期对应日期的星期几数值:
- 0 表示星期一 (Monday)
- 1 表示星期二 (Tuesday)
- …
- 6 表示星期日 (Sunday)
正确的使用示例
import pandas as pd
import numpy as np# 创建一个每日频率的 PeriodIndex
periods_daily = pd.period_range('2023-01-01', periods=7, freq='D')
print("原始 PeriodIndex:")
print(periods_daily)
print()# 获取星期几数值
day_of_week_values = periods_daily.day_of_week
print("对应的星期几数值 (0=周一, 6=周日):")
print(day_of_week_values)
print()# 正确获取星期名称的方法 - 通过 start_time 属性
day_names = periods_daily.start_time.day_name()
print("对应的星期名称:")
print(day_names)
print()# 创建包含更多信息的 DataFrame 来展示实际用途
df = pd.DataFrame({'period': periods_daily,'day_of_week': day_of_week_values,'day_name': day_names
})print("完整的数据展示:")
print(df)
执行结果:
原始 PeriodIndex:
PeriodIndex(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04','2023-01-05', '2023-01-06', '2023-01-07'],dtype='period[D]')对应的星期几数值 (0=周一, 6=周日):
Int64Index([6, 0, 1, 2, 3, 4, 5], dtype='int64')对应的星期名称:
Index(['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday','Saturday'],dtype='object')完整的数据展示:period day_of_week day_name
0 2023-01-01 6 Sunday
1 2023-01-02 0 Monday
2 2023-01-03 1 Tuesday
3 2023-01-04 2 Wednesday
4 2023-01-05 3 Thursday
5 2023-01-06 4 Friday
6 2023-01-07 5 Saturday
实际应用场景(修正版)
import pandas as pd
import numpy as np# 模拟一周的商店营业数据
dates = pd.period_range('2023-01-01', periods=30, freq='D') # 30天数据
sales = np.random.randint(1000, 5000, size=30) # 随机销售数据store_data = pd.DataFrame({'date': dates,'sales': sales
})# 正确添加星期相关信息
store_data['day_of_week'] = store_data['date'].dt.day_of_week
store_data['day_name'] = store_data['date'].dt.start_time.dt.day_name()
store_data['is_weekend'] = store_data['day_of_week'].isin([5, 6]) # 5=Saturday, 6=Sundayprint("商店营业数据示例:")
print(store_data.head(10))
print()# 分析工作日与周末的平均销售情况
weekday_weekend_analysis = store_data.groupby('is_weekend')['sales'].agg(['mean', 'std'])
weekday_weekend_analysis.index = ['工作日', '周末']
print("工作日与周末销售对比:")
print(weekday_weekend_analysis)
print()# 分析每天的销售模式
daily_pattern = store_data.groupby(['day_of_week', 'day_name'])['sales'].mean().reset_index()
daily_pattern = daily_pattern.sort_values('day_of_week')print("各星期的平均销售额:")
for _, row in daily_pattern.iterrows():print(f"{row['day_name']:>9} ({row['day_of_week']}): {row['sales']:.2f}")
其他获取星期相关信息的方法
import pandas as pd# 创建 PeriodIndex
periods = pd.period_range('2023-01-01', periods=7, freq='D')
print("原始 PeriodIndex:")
print(periods)
print()# 方法1: 使用 day_of_week 获取数值
print("星期几数值 (day_of_week):")
print(periods.day_of_week)
print()# 方法2: 使用 start_time.day_name() 获取名称
print("星期几名称 (start_time.day_name()):")
print(periods.start_time.day_name())
print()# 方法3: 使用 start_time.isocalendar() 获取 ISO 周信息
iso_calendar = periods.start_time.isocalendar()
print("ISO 周信息:")
print("年份:", iso_calendar.year.values)
print("周数:", iso_calendar.week.values)
print("星期:", iso_calendar.day.values) # 这里的 day 也是 1-7,其中 1=周一,7=周日
注意事项
-
[PeriodIndex]没有直接的
day_name()方法,需要通过start_time.day_name()来获取星期名称 -
[day_of_week] 属性返回的数值范围是 0-6,其中 0 表示星期一,6 表示星期日
-
对于月、季、年等低频 PeriodIndex,不能直接使用 [day_of_week],需要先通过 [start_time] 转换:
monthly_periods = pd.period_range('2023-01', periods=3, freq='M') # 错误方式: monthly_periods.day_of_week # 会出错 # 正确方式: monthly_weekdays = monthly_periods.start_time.day_of_week -
在处理 PeriodIndex 数据时,经常需要使用
.dt.start_time或.dt.end_time来访问具体的日期时间功能
