Pandas如何筛选5小时回溯窗口内连续3小时符合阈值要求的ID
Pandas连续达标ID筛选修复方案
你需要通过对达标记录做连续块分组的方式判断是否满足连续3小时要求,具体实现如下:
实现步骤
- 第一步:数据预处理,转换时间格式并筛选最近5小时的回溯数据
- 第二步:按ID分组后按时间排序,生成每一行的达标标记
- 第三步:为连续达标的记录生成相同的分组ID,用于区分不同的连续达标块
- 第四步:统计每个连续达标块的长度,筛选出存在长度≥3的块的ID
完整可运行代码
import pandas as pd # 1. 预处理时间列,筛选最近5小时回溯数据 df['Date'] = pd.to_datetime(df['Date'], dayfirst=True) latest_time = df['Date'].max() df_5h = df[df['Date'] > latest_time - pd.Timedelta(hours=5)].copy() # 2. 按ID+时间排序,生成单小时达标标记 df_5h = df_5h.sort_values(['IDs', 'Date']).reset_index(drop=True) df_5h['is_valid'] = (df_5h['PR_Rate'] > 50) & (df_5h['CT_12571'] < 30) # 3. 生成连续达标块的分组ID:同ID下达标状态变化时分组ID递增 df_5h['block_id'] = df_5h.groupby('IDs')['is_valid'].apply( lambda x: (x != x.shift()).cumsum() ).reset_index(drop=True) # 4. 统计达标块长度,筛选符合要求的ID valid_blocks = df_5h[df_5h['is_valid']].groupby(['IDs', 'block_id']).size().reset_index(name='block_len') target_ids = valid_blocks[valid_blocks['block_len'] >= 3]['IDs'].unique() # 最终结果:所有符合要求的ID对应的回溯期全量数据 result_df = df_5h[df_5h['IDs'].isin(target_ids)]
说明
你提供的样例数据运行后,会识别到ID为A1的连续达标块(12点、13点、14点)长度为3,符合要求会被纳入结果,原本非连续的10点、12点、13点不会被统计为达标。
- 如果数据集存在缺失小时的情况,可在排序后增加
df_5h = df_5h.groupby('IDs').apply(lambda x: x.set_index('Date').asfreq('H')).reset_index()补全缺失的小时行,避免因数据缺失导致连续判断错误。 - 若需要获取每个ID的具体连续达标时段,可直接从
valid_blocks中关联原始数据提取。
内容的提问来源于stack exchange,提问作者A_O
相关产品推荐
相关产品推荐

