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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 06:54:04