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

如何用pandas Grouper函数创建完整10分钟分组并丢弃剩余数据?

问题描述

我的pandas数据框df结构如下:

time_stamp      beats(in sec)   RR          BPM 
0   29140.870816    0.670           0.437757    137 
1   29141.333816    1.133           0.462341    129 
2   29141.823816    1.623           0.490448    122 
3   29142.292816    2.092           0.468517    128 
4   29142.760816    2.560           0.468215    128 
... ... ... ... ... ...
3708    30762.612816    1622.412    0.426784    140 
3709    30763.051816    1622.851    0.439165    136 
3710 rows × 5 columns

我希望将这些数据按10分钟间隔分组,规则是:最后一个间隔的数据若不足10分钟则直接丢弃。比如根据beats(in sec)列的最大值(1622.851秒),仅能创建2个完整的10分钟分组(截至1200秒),1200秒之后的数据不纳入分析。

目前我用pd.Grouper实现分组:

agg_10m = df.groupby(pd.Grouper(freq='10Min'))
agg_10m.ngroups

但这段代码生成了3个分组,请问如何使用Grouper函数或其他方法仅保留2个完整分组?

解决方案

方法1:先筛选数据再分组

先计算出最大的完整10分钟阈值(10分钟=600秒,2个完整组就是1200秒),过滤掉beats(in sec)超过1200秒的行,再进行分组:

# 计算完整分组的最大阈值:2个10分钟即1200秒
max_beat = 2 * 600
filtered_df = df[df['beats(in sec)'] <= max_beat]
agg_10m = filtered_df.groupby(pd.Grouper(freq='10Min'))
print(agg_10m.ngroups)  # 输出2

如果需要动态计算能容纳的完整分组数,可以这样:

total_seconds = df['beats(in sec)'].max()
full_groups = int(total_seconds // 600)
max_beat = full_groups * 600
filtered_df = df[df['beats(in sec)'] <= max_beat]
agg_10m = filtered_df.groupby(pd.Grouper(freq='10Min'))

方法2:分组后过滤不完整的组

如果不想提前过滤数据,可以先分组,然后筛选出包含完整10分钟数据的组。首先需要确保time_stamp是时间类型:

# 把time_stamp转为datetime类型(假设原始是unix时间戳,若不是请调整单位)
df['time_stamp'] = pd.to_datetime(df['time_stamp'], unit='s')
# 按10分钟间隔分组
agg_10m = df.groupby(pd.Grouper(key='time_stamp', freq='10Min'))
# 过滤出时间跨度覆盖完整10分钟的组(用1e-6避免浮点数精度问题)
full_groups = agg_10m.filter(lambda x: (x['time_stamp'].max() - x['time_stamp'].min()).total_seconds() >= 600 - 1e-6)
# 重新获取符合要求的分组
final_agg = full_groups.groupby(pd.Grouper(key='time_stamp', freq='10Min'))
print(final_agg.ngroups)

方法3:基于beats(in sec)直接分箱分组

既然是按beats(in sec)的累计时长分组,也可以直接对该列进行分箱,只保留完整的10分钟区间:

import numpy as np

# 按600秒(10分钟)为步长创建分箱
bins = np.arange(0, df['beats(in sec)'].max(), 600)
# 移除最后一个不完整的分箱
if bins[-1] + 600 > df['beats(in sec)'].max():
    bins = bins[:-1]
# 按分箱结果分组
agg_10m = df.groupby(pd.cut(df['beats(in sec)'], bins=bins))
print(agg_10m.ngroups)  # 输出2

内容的提问来源于stack exchange,提问作者bipvan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:37:31