基于movement_type筛选:AR与PK时间匹配索引获取问题排查
问题排查与优化方案
循环无结果的原因
- Datetime精度差异:尽管两列都是datetime类型,但可能存在微秒、纳秒级的隐形差异(比如一条记录是
2024-05-20 12:00:00.123,另一条是2024-05-20 12:00:00),直接用in判断会因为精度不匹配返回False。 - 索引逻辑错误:就算匹配成功,原代码打印的是
df_amove_PK["start_datetime"].index,这会输出PK数据集的所有索引,而非当前AR记录匹配到的单个/多个PK索引,你可能误以为没有匹配结果。 - 未按飞机分组匹配:场景明确是单架飞机的事件关联,但原代码没有通过
acreg字段分组,跨飞机的AR和PK自然无法匹配到预期的结果。
优化方案
方案1:修正循环逻辑(保留循环思路)
先统一datetime精度,再按飞机分组匹配,同时优化查找效率:
import pandas as pd # 统一datetime精度到秒,消除微秒差异 df_amove["end_datetime"] = df_amove["end_datetime"].dt.floor('s') df_amove["start_datetime"] = df_amove["start_datetime"].dt.floor('s') # 按飞机注册号分组处理,符合场景需求 for acreg, group_df in df_amove.groupby("acreg"): # 筛选当前飞机的AR和PK记录 ar_records = group_df[group_df["movement_type"] == "AR"] pk_records = group_df[group_df["movement_type"] == "PK"] # 把PK的起始时间转成集合,提升查找速度 pk_start_set = set(pk_records["start_datetime"]) # 遍历AR记录匹配PK for ar_idx, ar_row in ar_records.iterrows(): ar_end_time = ar_row["end_datetime"] if ar_end_time in pk_start_set: # 获取所有匹配的PK索引 matched_pk_indices = pk_records[pk_records["start_datetime"] == ar_end_time].index.tolist() print(f"AR索引 {ar_idx} 匹配到PK索引:{matched_pk_indices}")
方案2:用Pandas Merge高效匹配(推荐)
避免循环,利用Pandas的向量化操作提升效率,同时自动处理一对多匹配:
import pandas as pd # 统一datetime精度 df_amove["end_datetime"] = df_amove["end_datetime"].dt.floor('s') df_amove["start_datetime"] = df_amove["start_datetime"].dt.floor('s') # 提取AR和PK的关键数据,重命名时间列用于匹配 ar_data = df_amove[df_amove["movement_type"] == "AR"][["acreg", "end_datetime"]].reset_index() ar_data.rename(columns={"index": "ar_index", "end_datetime": "match_time"}, inplace=True) pk_data = df_amove[df_amove["movement_type"] == "PK"][["acreg", "start_datetime"]].reset_index() pk_data.rename(columns={"index": "pk_index", "start_datetime": "match_time"}, inplace=True) # 按飞机注册号+匹配时间关联,得到所有AR-PK匹配对 matched_results = pd.merge(ar_data, pk_data, on=["acreg", "match_time"], how="inner") # 输出匹配的索引对 print("AR-PK匹配索引对:") print(matched_results[["ar_index", "pk_index"]])
内容的提问来源于stack exchange,提问作者Hans.nl
相关产品推荐
相关产品推荐

