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

基于两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:54:02