如何检查DataFrame A的timestamp是否处于B的timestamp加15分钟区间内
校验DataFrame时间戳区间匹配实现方案
首先提前处理:确保两个DataFrame的timestamp列均转换为pandas datetime类型,避免时间计算异常:
import pandas as pd A['timestamp'] = pd.to_datetime(A['timestamp']) B['timestamp'] = pd.to_datetime(B['timestamp'])
方法1:交叉合并校验(仅适合小数据量场景)
数据量较大时不推荐,交叉合并会生成笛卡尔积,占用过高内存
- 生成B表时间区间的右边界
B['end_ts'] = B['timestamp'] + pd.Timedelta(minutes=15)
- 交叉合并两张表所有行,筛选符合区间要求的匹配项
cross_df = A.assign(tmp=1).merge(B.assign(tmp=1), on='tmp', how='outer') matched_ts = cross_df[ (cross_df['timestamp_x'] >= cross_df['timestamp_y']) & (cross_df['timestamp_x'] < cross_df['end_ts']) ]['timestamp_x'].unique()
- 给A表新增标记列,标识对应timestamp是否匹配成功
A['is_matched'] = A['timestamp'].isin(matched_ts)
方法2:merge_asof有序匹配(高性能,推荐全场景使用)
利用pandas原生有序匹配接口,不会生成笛卡尔积,性能远高于交叉合并方案
- 先对两张表按timestamp升序排序
A_sorted = A.sort_values('timestamp').reset_index(drop=True) B_sorted = B.sort_values('timestamp').reset_index(drop=True) # 重命名B表的timestamp列避免合并时重名冲突 B_sorted = B_sorted.rename(columns={'timestamp': 'b_timestamp'})
- 执行后向匹配,为A的每个timestamp匹配到最近的、小于等于它的B表timestamp
merged = pd.merge_asof( A_sorted, B_sorted[['b_timestamp']], left_on='timestamp', right_on='b_timestamp', direction='backward' )
- 校验匹配到的B表时间加15分钟是否覆盖A的timestamp,空值代表无匹配直接标记为False
merged['is_matched'] = merged['timestamp'] <= merged['b_timestamp'] + pd.Timedelta(minutes=15) merged['is_matched'] = merged['is_matched'].fillna(False)
最终merged表的is_matched列就是A中每个timestamp的校验结果,True代表存在符合要求的B的时间区间,False代表不存在。
内容的提问来源于stack exchange,提问作者Deba
相关产品推荐
相关产品推荐

