如何用Pandas按小时分组汇总一周时间序列数据并绘图?
解决方案:按小时汇总时间序列数据并可视化
我来帮你搞定这个时间序列分组和可视化的问题~先理清楚你的核心需求:用一周的时间序列数据,不通过循环,按小时维度汇总每日对应小时的Count值,最后生成图表展示结果。咱们先拆解你之前尝试的问题,再给出精准的代码方案。
为什么之前的方法没达到预期?
df.resample('h').sum():这个是对连续的每小时时间段做汇总(比如2024-01-01 00:00-01:00的Count总和),但你要的是跨天的同一小时汇总(比如所有日期的0点Count加总),所以方向不对。groupby([times.hour, times.day]):这个分组逻辑是对的,但你可能没做后续的unstack操作,导致结果是嵌套的分组对象,没法直接看每日对应小时的汇总值,更没法直接绘图。
完整实现步骤(附代码)
1. 先确保数据索引是Datetime类型
如果你的DataFrame索引还不是时间格式,先转换:
import pandas as pd import matplotlib.pyplot as plt # 假设你的数据读取后是这样的(替换成你的实际数据路径) # df = pd.read_csv('your_data.csv', index_col='datetime_column') df.index = pd.to_datetime(df.index) # 转换为DatetimeIndex
2. 两种汇总方式,按需选择
方式一:汇总一周内同一小时的总Count(比如所有天的0点Count相加,得到24个值)
这应该是你提到的“汇总每日对应小时的Count值”的核心需求,代码如下:
# 按小时(0-23)分组,对Count求和 hourly_weekly_total = df.groupby(df.index.hour)['Count'].sum()
对应的可视化(柱状图最直观):
plt.figure(figsize=(12, 6)) hourly_weekly_total.plot(kind='bar', color='skyblue') plt.title('Weekly Total Count by Hour of Day') plt.xlabel('Hour (0-23)') plt.ylabel('Total Count') plt.xticks(rotation=0) # 让小时标签不倾斜 plt.grid(axis='y', linestyle='--', alpha=0.7) plt.show()
方式二:按日期+小时分组,查看每日每个小时的Count值(比如每天0点、1点的各自汇总)
如果需要对比一周内每天同一小时的差异,可以用这个:
# 按日期和小时分组,然后unstack把日期转成列,方便横向对比 daily_hourly = df.groupby([df.index.date, df.index.hour])['Count'].sum().unstack(level=0)
对应的可视化(多折线图展示每日趋势):
plt.figure(figsize=(14, 7)) daily_hourly.plot(ax=plt.gca()) plt.title('Hourly Count per Day (Weekly Data)') plt.xlabel('Hour of Day') plt.ylabel('Count') plt.legend(title='Date', bbox_to_anchor=(1.05, 1), loc='upper left') # 把图例放外面避免遮挡 plt.grid(axis='y', linestyle='--', alpha=0.7) plt.tight_layout() # 自动调整布局适配图例 plt.show()
模拟完整示例
如果你需要测试,可以用这段模拟数据跑通整个流程:
import pandas as pd import matplotlib.pyplot as plt import numpy as np # 生成一周的每小时时间序列数据(Count值随机) dates = pd.date_range(start='2024-01-01 00:00', end='2024-01-07 23:00', freq='h') df = pd.DataFrame({'Count': np.random.randint(10, 50, size=len(dates))}, index=dates) # 转换索引(这里已经是DatetimeIndex,可省略) df.index = pd.to_datetime(df.index) # 方式一:同一小时总汇总可视化 hourly_weekly_total = df.groupby(df.index.hour)['Count'].sum() plt.figure(figsize=(12,6)) hourly_weekly_total.plot(kind='bar', color='skyblue') plt.title('Weekly Total Count by Hour of Day') plt.xlabel('Hour (0-23)') plt.ylabel('Total Count') plt.xticks(rotation=0) plt.grid(axis='y', linestyle='--', alpha=0.7) plt.show() # 方式二:每日各小时汇总可视化 daily_hourly = df.groupby([df.index.date, df.index.hour])['Count'].sum().unstack(level=0) plt.figure(figsize=(14,7)) daily_hourly.plot(ax=plt.gca()) plt.title('Hourly Count per Day (Weekly Data)') plt.xlabel('Hour of Day') plt.ylabel('Count') plt.legend(title='Date', bbox_to_anchor=(1.05,1), loc='upper left') plt.grid(axis='y', linestyle='--', alpha=0.7) plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者Matteo Peluso
相关产品推荐
相关产品推荐

