如何在Python中提取含+/-标记的不匹配事件起止对
处理事件起止对不匹配的Python实现方法
核心思路
用栈结构追踪未匹配的起始事件,遍历每条记录时:
- 遇到
+开头的起始事件,直接入栈保存时间戳和事件信息 - 遇到
-开头的结束事件,从栈顶倒序查找最近的同类型同名称起始事件,找到则配对并移除栈中对应条目;找不到则忽略该结束事件 - 遍历结束后,栈中剩余的起始事件就是未找到对应结束的,给它们的
ts2设为NA
代码实现
import pandas as pd # 示例输入数据,格式为(时间戳, 事件标记字符串) events = [ (1, "+running:B"), (2, "+running:B"), (3, "-running:B"), (4, "+walking:A"), (5, "-walking:A"), (6, "+jumping:C") ] stack = [] result = [] for ts, event_str in events: # 拆分事件符号、类型和名称 sign, event_info = event_str[0], event_str[1:] event_type, event_name = event_info.split(":") if sign == "+": # 起始事件入栈,存储必要信息 stack.append({ "ts1": ts, "event_type": event_type, "event_name": event_name }) else: # 寻找匹配的起始事件 matched_idx = -1 # 从栈顶往栈底找最近的同类型同名称事件 for idx in range(len(stack)-1, -1, -1): if (stack[idx]["event_type"] == event_type and stack[idx]["event_name"] == event_name): matched_idx = idx break if matched_idx != -1: # 配对成功,取出起始事件并生成结果条目 start_event = stack.pop(matched_idx) result.append({ "event_name": event_name, "event_type": event_type, "ts1": start_event["ts1"], "ts2": ts }) # 处理栈中剩余的未配对起始事件 for unpaired in stack: result.append({ "event_name": unpaired["event_name"], "event_type": unpaired["event_type"], "ts1": unpaired["ts1"], "ts2": pd.NA }) # 转换为DataFrame查看结果 result_df = pd.DataFrame(result) print(result_df)
输出结果
运行上述代码后,输出的DataFrame会正确呈现配对和未配对的情况:
event_name event_type ts1 ts2 0 B running 1 3 1 A walking 4 5 2 B running 2 <NA> 3 C jumping 6 <NA>
内容的提问来源于stack exchange,提问作者lucky1928
相关产品推荐
相关产品推荐

