Pandas中秒级时序数据按分钟分箱分组计算的实现方法咨询
按分钟重采样统计秒级时序数据的实现方案
前置校验
首先确保DataFrame的索引是datetime64类型,这是resample方法生效的前提,很多调用失败都是因为索引仍为字符串格式:
- 校验索引类型:
print(df.index.dtype) - 若不是datetime类型,先转换:
df.index = pd.to_datetime(df.index)
方案1:用resample实现(推荐)
resample是pandas专门用于时序重采样的内置方法,直接指定'T'(代表分钟级)作为重采样规则即可实现00秒-59秒的分钟区间分组:
基础用法示例
# 统计每分钟所有列的均值 df_minute = df.resample('T').mean() # 统计每分钟所有列的总和 df_minute = df.resample('T').sum() # 取每分钟的第一条/最后一条原始记录 df_first_per_min = df.resample('T').first() df_last_per_min = df.resample('T').last()
多列自定义聚合
如果不同列需要不同统计规则,用agg方法实现:
df_minute = df.resample('T').agg( 访问量总和=('pv_col', 'sum'), 平均响应时间=('rt_col', 'mean'), 峰值带宽=('bandwidth_col', 'max'), 有效采集点数=('pv_col', 'count') )
方案2:用groupby实现
如果更习惯用groupby语法,可以通过索引的floor方法截断到分钟级再分组:
df_minute = df.groupby(df.index.floor('T')).agg( # 此处填写和resample一致的聚合规则即可 pv_sum=('pv_col', 'sum') )
常见问题处理
- 若重采样后出现大量空值,是对应分钟无采集数据,可按需填充:
- 空值填0:
df.resample('T').mean().fillna(0) - 用前一分钟的值填充:
df.resample('T').mean().ffill()
- 空值填0:
- 若分组时间和实际时区有偏移,先把索引转换到对应时区再重采样:
df.index = df.index.tz_convert('Asia/Shanghai')
内容的提问来源于stack exchange,提问作者havingaball
相关产品推荐
相关产品推荐

