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

