如何实现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
相关产品推荐
相关产品推荐

