基于Pandas将DataFrame中15分钟间隔的DateTime统计值按小时分组
Pandas将15分钟间隔的统计值按小时分组方案
嘿,刚好碰到过类似需求,给你两个靠谱的方案,完全符合日期逻辑,绝对不会只取每个小时的首个值!
首先咱们得明确核心:把每小时内的4个15分钟统计值(如果数据完整的话)做合理聚合,比如求和、均值等,而不是只拿第一个值。下面用示例代码一步步演示:
1. 先准备示例数据
假设你的DataFrame有timestamp(日期时间列)和count(统计值列),先构造一个模拟数据集:
import pandas as pd import numpy as np # 生成2小时的15分钟间隔数据 timestamps = pd.date_range(start='2024-05-20 08:00:00', periods=8, freq='15min') df = pd.DataFrame({ 'timestamp': timestamps, 'count': np.random.randint(10, 50, size=8) })
2. 方案一:用resample(时间序列专用,推荐)
resample是Pandas专门为时间序列分组设计的工具,用法简洁且逻辑清晰:
# 第一步:将日期时间列设为索引(resample要求时间类型的索引) df.set_index('timestamp', inplace=True) # 第二步:按小时聚合,这里用sum()求和,你也可以换成mean()/max()等 hourly_df = df.resample('H').sum() # 可选:把时间索引转回普通列 hourly_df.reset_index(inplace=True)
解释:resample('H')会自动把所有属于同一小时的15分钟数据归为一组,sum()则把组内的count累加起来——完全符合日期逻辑,不会出现只取首个值的问题。
3. 方案二:用groupby结合dt.floor
如果不想修改索引,也可以用groupby配合时间向下取整来实现:
# 第一步:给DataFrame新增一列,把每个时间戳向下取整到对应小时 df['hour_group'] = df['timestamp'].dt.floor('H') # 第二步:按新增的小时分组列聚合count hourly_df = df.groupby('hour_group')['count'].sum().reset_index()
解释:dt.floor('H')会把8:15、8:30、8:45这类时间统一转为8:00,这样同一天同一小时的所有数据都会被分到同一组,再通过聚合函数处理组内数据。
注意事项
- 确保你的
timestamp列是datetime类型,如果不是,先执行df['timestamp'] = pd.to_datetime(df['timestamp'])转换。 - 聚合函数可以根据业务需求替换:比如求每小时的平均统计值用
mean(),求最大值用max(),但绝对不要用first()(这就是你说的“累加首个值”的错误方案)。
内容的提问来源于stack exchange,提问作者Nik
相关产品推荐
相关产品推荐

