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

Python如何基于最近日期匹配及附加列拼接两个DataFrame

实现方案

你提到的merge_asof实际上完全适配当前需求,该方法提供的by参数可指定分组匹配键,会在每个分组内单独执行日期的最近匹配,刚好满足你按pty分组后、匹配对应分组内小于等于inv_dt的最近alert_dt的要求。

merge_asof要求两个DataFrame的日期列必须为datetime类型,且按参与匹配的日期列升序排序,完整实现代码如下:

import pandas as pd

# 1. 转换日期列为datetime格式(原日期格式为日/月/年)
df_alert['alert_dt'] = pd.to_datetime(df_alert['alert_dt'], format='%d/%m/%Y')
df_inv['inv_dt'] = pd.to_datetime(df_inv['inv_dt'], format='%d/%m/%Y')

# 2. 按日期列升序排序
df_alert = df_alert.sort_values('alert_dt').reset_index(drop=True)
df_inv = df_inv.sort_values('inv_dt').reset_index(drop=True)

# 3. 按pty分组后执行最近日期匹配
result = pd.merge_asof(
    left=df_inv,
    right=df_alert,
    by='pty',  # 按pty分组,仅在同分组内匹配日期
    left_on='inv_dt',  # 左表匹配日期列
    right_on='alert_dt',  # 右表匹配日期列
    direction='backward'  # 匹配小于等于inv_dt的最近alert_dt
)

# 4. 调整输出格式符合要求
result = result.rename(columns={'alert_dt': 'closest_alert_dt_before_inv_dt'})
# 日期转回原字符串格式
result['inv_dt'] = result['inv_dt'].dt.strftime('%d/%m/%Y')
result['closest_alert_dt_before_inv_dt'] = result['closest_alert_dt_before_inv_dt'].dt.strftime('%d/%m/%Y')
# 调整列顺序
result = result[['inv_dt', 'closest_alert_dt_before_inv_dt', 'pty']]

运行上述代码得到的result与你给出的期望输出完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 23:45:03