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

如何基于客户、产品编码及日期范围条件合并Pandas DataFrame

问题原因

你现有的代码仅完成了客户、产品编码两个字段的等值匹配,没有对支付日期是否落在特惠活动的有效区间做过滤,因此会生成大量不符合规则的匹配结果。

解决方案

方案1:小数据集适用(无需额外依赖)

先完成等值合并,再按日期区间过滤结果,逻辑简单易读:

import pandas as pd

# 首先统一转换所有日期字段为datetime格式,避免字符串比较出错
df1['paydate'] = pd.to_datetime(df1['paydate'])
df2['date_from'] = pd.to_datetime(df2['date_from'])
df2['date_untill'] = pd.to_datetime(df2['date_untill'])

# 先按等值字段合并
nef_df = pd.merge(df1, df2[['Customer', 'Product_code', 'date_from', 'date_untill']], 
                  on=['Customer', 'Product_code'])
# 过滤出支付日期落在特惠有效期内的行
nef_df = nef_df[(nef_df['paydate'] >= nef_df['date_from']) & 
                (nef_df['paydate'] <= nef_df['date_untill'])]

方案2:大数据集适用(减少内存占用)

如果两个数据集量级较大,等值合并会产生大量冗余临时行,可借助pandasql直接在关联阶段完成条件过滤,更高效:

import pandas as pd
from pandasql import sqldf

# 同样先统一日期字段格式
df1['paydate'] = pd.to_datetime(df1['paydate'])
df2['date_from'] = pd.to_datetime(df2['date_from'])
df2['date_untill'] = pd.to_datetime(df2['date_untill'])

# 用SQL语法直接实现带范围条件的关联
sql = """
SELECT a.*, b.date_from, b.date_untill
FROM df1 a
LEFT JOIN df2 b
ON a.Customer = b.Customer 
AND a.Product_code = b.Product_code
AND a.paydate BETWEEN b.date_from AND b.date_untill
"""
nef_df = sqldf(sql)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:39:02