You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:55:04