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

如何用纯Pandas获取满足条件的最长连续时段起止时间

纯Pandas实现正负值最长连续时段提取

完全可以用纯Pandas实现这个需求,核心思路是通过分组标记识别连续的正负状态区间,再聚合计算各区间的时长,最终筛选出最长时段的起止时间。以下是具体实现步骤:

步骤1:确保索引为DateTime类型

如果你的DataFrame索引还不是DateTime格式,先进行转换:

import pandas as pd
import numpy as np

# 假设你的DataFrame名为df
df.index = pd.to_datetime(df.index)

步骤2:生成状态标记与分组ID

通过状态变化来划分连续区间:

# 标记每行的正负状态(排除等于0的情况,可根据需求调整)
df['status'] = np.where(df['PlusOrMinus'] > 0, 'positive', 
                        np.where(df['PlusOrMinus'] < 0, 'negative', 'zero'))

# 生成分组ID:当状态与上一行不同时,分组ID递增
df['group_id'] = (df['status'] != df['status'].shift()).cumsum()

步骤3:聚合计算各区间的起止时间及时长

按状态和分组ID聚合,得到每个连续区间的关键信息:

grouped = df.groupby(['status', 'group_id']).agg(
    start_time=('index', 'first'),
    end_time=('index', 'last'),
    duration=('index', lambda x: x.max() - x.min())
).reset_index()

步骤4:筛选最长连续时段

分别提取正负状态下时长最长的区间:

# 获取最长负向连续时段
longest_negative = grouped[grouped['status'] == 'negative'].sort_values('duration', ascending=False).iloc[0]
neg_start = longest_negative['start_time']
neg_end = longest_negative['end_time']

# 获取最长正向连续时段
longest_positive = grouped[grouped['status'] == 'positive'].sort_values('duration', ascending=False).iloc[0]
pos_start = longest_positive['start_time']
pos_end = longest_positive['end_time']

补充说明

  • 如果存在多个时长相同的最长时段,上述代码会选取第一个出现的区间;
  • 若数据中不存在某一状态(比如全为正值),建议添加判断逻辑避免索引越界;
  • 若需要处理PlusOrMinus=0的情况,可在状态标记和后续筛选中自行扩展。

内容的提问来源于stack exchange,提问作者Nikodem Jędrzejczak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 23:45:41