Pandas按特定条件重采样:同一ID+Serial每15分钟仅统计一次
问题描述
现有一个DataFrame df,数据结构如下:
Start date Final date Value ID Serial 2022-09-01 01:09:07.093 2022-09-01 05:43:55.092999999 10.92 200 120 2022-09-01 01:14:07.093 2022-09-01 05:43:55.092999999 10.92 200 120 2022-09-01 01:19:07.093 2022-09-01 05:43:55.092999999 10.92 200 120 2022-09-01 01:13:07.093 2022-09-01 03:41:55.092999999 11.85 201 122 ... 2022-09-02 01:19:07.093 2022-09-03 07:43:55.092999999 7.35 300 124 2022-09-02 01:24:07.093 2022-09-03 07:43:55.092999999 7.35 300 124 ...
每组ID与Serial的组合,会从Start date到Final date每5分钟生成一条记录。需求是按15分钟间隔对该DataFrame重采样,并对Value字段求和,但每个15分钟间隔内同一ID+Serial组合仅统计一次。
最初实现代码:
df = df.resample('15min', on='Start date')['Value'].sum()
该代码会导致同一ID+Serial组合在同一个15分钟间隔内被多次统计,不符合需求:
- 实际输出示例:
Date Value 2022-09-01 01:00:00 33.69 2022-09-01 01:15:00 10.92 ... 2022-09-02 01:15:00 14.7 ...
- 预期输出示例:
Date Value 2022-09-01 01:00:00 22.70 2022-09-01 01:15:00 10.92 ... 2022-09-02 01:15:00 7.35 ...
注:每个时间间隔内存在大量不同的ID与Serial组合。
解决方案
核心思路是先对每个15分钟窗口内的ID+Serial组合去重,再进行求和,具体步骤如下:
- 给每条记录标记其所属的15分钟窗口时间戳
df['15min_window'] = df['Start date'].dt.floor('15min')
- 按
15min_window、ID、Serial分组,保留每组的第一条记录(同组内Value值一致,取mean()/max()结果也相同)
df_unique = df.groupby(['15min_window', 'ID', 'Serial']).first().reset_index()
- 按15分钟窗口对去重后的数据求和,调整索引和列名匹配预期输出
result = df_unique.groupby('15min_window')['Value'].sum().rename_axis('Date').reset_index()
也可以用链式写法简化代码:
result = (df .assign(window=df['Start date'].dt.floor('15min')) .groupby(['window', 'ID', 'Serial'])['Value'].first() .groupby('window').sum() .rename_axis('Date') .reset_index(name='Value'))
关键说明
dt.floor('15min')将Start date向下取整到最近的15分钟间隔,统一窗口的时间标记- 双重分组确保先去重(同一窗口内的ID+Serial只留一条),再求和,彻底避免重复统计问题
内容的提问来源于stack exchange,提问作者OAP
相关产品推荐
相关产品推荐

