如何用Pandas为跨3年时间序列生成按周划分的小时级直方图
按周一至周日周期生成周度小时分箱直方图
解决方案步骤
- 先确保时间列是
datetime类型,若未转换先执行df['timesheet_start'] = pd.to_datetime(df['timesheet_start']) - 按周一为起始的周分组,使用
pd.Grouper(freq='W-MON')定义周周期,确保每组对应周一到周日的完整一周 - 遍历每个周分组,对组内数据按1小时分箱统计数量,再绘制独立直方图
完整代码示例
import pandas as pd import matplotlib.pyplot as plt # 确保时间列转换为datetime类型(如果未处理过) df['timesheet_start'] = pd.to_datetime(df['timesheet_start']) # 按周一起始的周分组,基于timesheet_start列划分区间 weekly_groups = df.groupby(pd.Grouper(key='timesheet_start', freq='W-MON')) # 遍历每个周分组生成直方图 for week_start, group in weekly_groups: # 计算该周的周日结束日期 week_end = week_start + pd.Timedelta(days=6) # 对当前周数据按1小时分箱统计,指定具体列避免多列计数干扰 hourly_counts = group.groupby(pd.Grouper(key='timesheet_start', freq='60Min')).count()['timesheet_start'] # 绘制直方图 plt.figure(figsize=(12, 6)) hourly_counts.plot(kind='bar') # 设置明确的标题和轴标签 plt.title(f'小时分箱直方图:{week_start.date()} 至 {week_end.date()}') plt.xlabel('时间(小时)') plt.ylabel('记录数量') # 调整x轴标签角度避免重叠 plt.xticks(rotation=45) plt.tight_layout() plt.show()
关键细节说明
freq='W-MON':指定周的起始为周一,每个分组覆盖周一00:00至下周一00:00前的区间,完美匹配你需要的周一至周日周期- 指定统计列:
count()['timesheet_start']确保只统计目标列的数量,避免DataFrame多列导致的冗余数据 - 独立图表输出:每个周的直方图单独显示,若需要批量保存可在
plt.show()前添加plt.savefig(f'week_{week_start.date()}.png')
内容的提问来源于stack exchange,提问作者K Max
相关产品推荐
相关产品推荐

