Python通过匹配两列日期间隔查找对应ISIN值并新增到DataFrame列
解决方法
前置处理
首先需要统一把三个日期字段转换为pandas的datetime格式,同时修正df2中部分行From日期晚于To日期的异常:
import pandas as pd # 转换所有日期字段为时间类型 df1['Date'] = pd.to_datetime(df1['Date']) df2['From'] = pd.to_datetime(df2['From']) df2['To'] = pd.to_datetime(df2['To']) # 修正日期区间异常,也可根据需求直接过滤掉无效区间行 df2[['From', 'To']] = df2[['From', 'To']].apply(lambda x: sorted(x), axis=1, result_type='expand')
日期区间匹配
根据你的数据量可以选择两种实现方案:
方案1:数据量较小场景(行数<1w),写法简单易维护
逐行遍历df1的日期,匹配df2中符合区间的ISIN:
def get_isin(target_date): filter_mask = (df2['From'] <= target_date) & (df2['To'] >= target_date) match_res = df2.loc[filter_mask, 'ISIN'] # 无匹配返回空值,多匹配默认取第一条结果 return match_res.iloc[0] if len(match_res) > 0 else None df1['ISIN'] = df1['Date'].apply(get_isin)
方案2:数据量较大场景,使用pandas 2.2+提供的条件连接,效率比逐行遍历高10倍以上
df1 = df1.merge( df2[['From', 'To', 'ISIN']], how='left', condition=lambda left, right: (left['Date'] >= right['From']) & (left['Date'] <= right['To']) ).drop_duplicates(subset=df1.columns.tolist(), keep='first')
示例匹配结果说明
你提供的示例数据中,匹配后部分结果如下:
| 原Date | 匹配ISIN |
|---|---|
| 2011-08-02 | DE0001135440 |
| 2011-10-05 | DE0001135457 |
| 2011-12-04 | DE0001135465 |
| 2011-01-25 | 空值(无匹配区间) |
内容的提问来源于stack exchange,提问作者Stingray
相关产品推荐
相关产品推荐

