You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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-02DE0001135440
2011-10-05DE0001135457
2011-12-04DE0001135465
2011-01-25空值(无匹配区间)

内容的提问来源于stack exchange,提问作者Stingray

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:09:01