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

如何检测Pandas DataFrame中两列二进制信号的重叠事件?

解决Pandas中检测二进制信号独立重叠事件的起止时间问题

我来帮你搞定这个需求!要精准找到A和B同时为1的独立重叠事件,核心思路是先标记重叠行,再把连续的重叠区块划分为独立事件,最后提取每个事件的首尾时间戳。下面是具体的实现步骤:

步骤1:标记A、B同时为1的重叠行

首先新增一个overlap列,专门标记满足条件的行:

df['overlap'] = (df['A'] == 1.0) & (df['B'] == 1.0)

步骤2:为连续重叠区块分配唯一事件ID

我们需要把连续的True(重叠)行归为同一个事件,非重叠行则排除在外。通过对比当前行与上一行的overlap状态,生成唯一的分组ID:

import numpy as np

# 当overlap从False变为True时,触发新事件的ID计数
df['event_id'] = (df['overlap'] & ~df['overlap'].shift(1)).cumsum()
# 仅保留重叠行的事件ID,非重叠行设为NaN
df['event_id'] = df['event_id'].where(df['overlap'], np.nan)

步骤3:提取每个事件的起止时间

通过groupby按事件ID分组,提取每个组的第一个和最后一个索引(即事件的起止时间):

# 分组聚合,获取每个事件的首尾时间
event_details = df.groupby('event_id').agg(
    start_time=('overlap', lambda x: x.index[0]),
    end_time=('overlap', lambda x: x.index[-1])
)

# 按期望格式输出结果
for idx, row in event_details.iterrows():
    event_num = int(idx)
    print(f'event{event_num}_startTime = {row.start_time.strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]}')
    print(f'event{event_num}_endTime = {row.end_time.strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]}')

运行结果

把上述代码加入你的示例脚本中,执行后会输出完全符合你预期的结果:

event1_startTime = 2020-05-19 00:00:01.500
event1_endTime = 2020-05-19 00:00:02.500
event2_startTime = 2020-05-19 00:00:13.000
event2_endTime = 2020-05-19 00:00:14.500
event3_startTime = 2020-05-19 00:00:42.000
event3_endTime = 2020-05-19 00:00:43.000

原理补充

  • df['overlap'].shift(1):将重叠标记列向上偏移一行,用于对比当前行与上一行的状态变化。
  • (df['overlap'] & ~df['overlap'].shift(1)):仅保留从"非重叠"切换到"重叠"的行(即每个事件的起始行)。
  • cumsum():对起始行进行累加,生成唯一的事件ID,确保连续重叠行属于同一事件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 17:42:40