如何过滤Pandas DataFrame列并按星期生成小时到访量直方图
实现按星期维度生成小时到访人数直方图
没问题!我来帮你一步步实现这个需求——按星期拆分数据,生成七个直方图,分别展示一周中每天各小时的到访人数。下面是具体的实现方法,我会覆盖数据预处理、分组过滤和绘图的全流程:
1. 准备数据与预处理
首先确保你的DataFrame包含时间戳(或可提取时间的字段)、到访人数列。如果没有现成的星期和小时字段,我们可以从时间戳中提取:
import pandas as pd import matplotlib.pyplot as plt # 示例数据(替换成你自己的DataFrame即可) data = { 'timestamp': pd.date_range(start='2024-01-01', periods=1400, freq='H'), # 生成7天以上的小时级数据 'visitors': pd.np.random.randint(10, 150, size=1400) } df = pd.DataFrame(data) # 从时间戳提取星期名称和小时 df['day_of_week'] = df['timestamp'].dt.day_name() # 得到"Monday"、"Tuesday"这类字符串 df['hour'] = df['timestamp'].dt.hour # 得到0-23的小时数
如果你的星期字段是数字格式(0=周一,6=周日),可以用dt.dayofweek替代dt.day_name(),后续调整星期列表即可。
2. 按星期过滤并绘制子图
我们用Matplotlib的子图布局来放7个直方图,这里选择3行3列的布局(刚好放下7个,剩下2个隐藏即可):
# 定义星期顺序(确保从周一到周日排列) week_days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] # 创建子图布局 fig, axes = plt.subplots(nrows=3, ncols=3, figsize=(16, 12)) axes = axes.flatten() # 把二维子图数组转为一维,方便循环遍历 # 循环每个星期,绘制对应直方图 for idx, day in enumerate(week_days): # 过滤当前星期的数据 filtered_data = df[df['day_of_week'] == day] # 统计每个小时的平均到访人数(避免同一小时多个数据点重叠,更直观) hourly_avg = filtered_data.groupby('hour')['visitors'].mean().reset_index() # 绘制柱状图(用bar比hist更适合展示每个小时的数值) axes[idx].bar(hourly_avg['hour'], hourly_avg['visitors'], color='#4287f5') axes[idx].set_title(f'{day} Hourly Visitor Count', fontsize=12) axes[idx].set_xlabel('Hour of Day', fontsize=10) axes[idx].set_ylabel('Number of Visitors', fontsize=10) axes[idx].set_xticks(range(0, 24)) # 设置x轴刻度为0-23点 axes[idx].grid(axis='y', linestyle='--', alpha=0.7) # 添加y轴网格线,提升可读性 # 隐藏多余的两个子图(3*3=9,我们只用到前7个) for i in range(7, 9): axes[i].set_visible(False) plt.tight_layout() # 自动调整子图间距,避免标题重叠 plt.show()
3. 额外优化建议
- 如果你的数据量很大,优先用每个小时的平均值/中位数来绘图,避免原始数据的杂乱重叠;
- 可以给不同星期的柱子设置差异化颜色,或者统一风格保持视觉一致性;
- 如果需要保存图表,在
plt.show()前添加plt.savefig('weekly_hourly_visitors.png', dpi=300)即可生成高清图片。
内容的提问来源于stack exchange,提问作者Hernan
相关产品推荐
相关产品推荐

