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

如何实现Pandas DataFrame双条件时间段筛选(已完成第一条件)

筛选满足双条件的连续时间段解决方案

问题背景

有一个以Timestamp为索引的DataFrame,包含data和mov_avg列(大部分data值为1),需要筛选同时满足以下两个条件的连续时间段:

  • 条件1:mov_avg低于1的连续时间戳数量超过X(示例X=7)
  • 条件2:该时间段内data列值低于1的数量至少为Y(示例Y=5)

你已实现条件1的判断,以下是补充条件2并结合双条件的完整解决方案:

完整实现代码

import pandas as pd
import numpy as np

# 假设已加载目标DataFrame(可通过提供的复现代码生成)
# df = ...

# --- 处理条件1:标记连续mov_avg<1且长度超过X的段 ---
df['pos_out'] = df['mov_avg'] < 1
# 对连续的pos_out段分组
g = df['pos_out'].ne(df['pos_out'].shift()).cumsum()
# 计算每个连续段的长度
min_out_days = 7  # 示例X值
df['cons_days_out'] = df.groupby(g)['pos_out'].transform('size') * np.where(df['pos_out'], 1, 0)
df['out_cond1'] = df['cons_days_out'] > min_out_days

# --- 处理条件2:标记段内data<1数量≥Y的段 ---
df['data_below_1'] = df['data'] < 1
# 计算每个连续段内data<1的总数
min_data_below = 5  # 示例Y值
df['count_data_below'] = df.groupby(g)['data_below_1'].transform('sum')
df['out_cond2'] = df['count_data_below'] >= min_data_below

# --- 结合双条件,筛选符合要求的行 ---
# 仅在mov_avg<1的行中,同时满足两个条件的标记为True
df['final_cond'] = df['pos_out'] & df['out_cond1'] & df['out_cond2']
# 提取最终符合条件的所有行
result_df = df[df['final_cond']]

扩展:提取时间段起止信息

如果需要获取每个符合条件的时间段的起止时间及统计数据,可添加以下代码:

# 获取所有符合条件的连续段分组ID
valid_groups = df[df['final_cond']]['g'].unique()

# 遍历分组,整理时间段信息
period_details = []
for group_id in valid_groups:
    group_data = df[df['g'] == group_id]
    period_details.append({
        'start_time': group_data.index.min(),
        'end_time': group_data.index.max(),
        'total_duration': len(group_data),
        'data_below_count': group_data['data_below_1'].sum()
    })

# 转为DataFrame查看
periods_df = pd.DataFrame(period_details)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:15:43