基于两个DataFrame的日期时间区间条件为数据集新增列的实现方法
实现方案
你可以通过pandas.merge_asof实现高效的区间匹配,该方法性能远高于逐行遍历,适合各类数据量场景:
前置依赖
确保你已经导入了所需库:
import pandas as pd import numpy as np
方法1:merge_asof实现(推荐)
# merge_asof要求匹配键有序,先对两个表的时间列排序 Exp_sorted = Exp.sort_values('Date').reset_index(drop=True) df_sorted = df.sort_values('Date').reset_index(drop=True) # 按最近的起始时间匹配 df_result = pd.merge_asof(df_sorted, Exp_sorted, on='Date', direction='backward') # 过滤不符合结束时间的行,不匹配的行Conditions设为空值,你也可以自定义默认值 df_result['Conditions'] = df_result.apply( lambda row: row['Conditions'] if row['Date'] <= row['E_Date'] else pd.NA, axis=1 ) # 清理不需要的E_Date列 df_result = df_result.drop(columns=['E_Date'])
方法2:IntervalIndex实现(小数据量场景更直观)
如果你需要匹配的区间数量不多,可以直接构造区间索引实现匹配:
# 构造闭区间索引,closed='both'对应你要求的<=、>=规则 exp_intervals = pd.IntervalIndex.from_arrays(Exp['Date'], Exp['E_Date'], closed='both') # 构造区间到Conditions的映射 interval_map = dict(zip(exp_intervals, Exp['Conditions'])) # 逐行匹配区间 df['Conditions'] = df['Date'].map( lambda x: interval_map[exp_intervals[exp_intervals.contains(x)][0]] if len(exp_intervals[exp_intervals.contains(x)]) > 0 else pd.NA )
结果说明
两种方法最终都会在df中生成符合要求的Conditions列,匹配规则完全符合Exp['Date'] <= df['Date'] <= Exp['E_Date']的要求,无匹配的行会返回空值,你可以根据需求替换为自定义默认值。
内容的提问来源于stack exchange,提问作者Zephyr
相关产品推荐
相关产品推荐

