使用Pandas提取上月最近日期Last MTD数据:同日无销售场景
解决上月无同日商品数据时提取最近日期Last MTD的问题
核心问题分析
当前用pd.merge严格匹配上月同日+商品,导致上月同日无数据时返回空值(后被填充为0),无法满足"取上月最近日期MTD"的需求。需要替换为基于最近日期匹配的逻辑,而非精确日期匹配。
解决方案代码
假设原始数据包含Date(日期)、Product(商品)、MTD(累计销售额)字段,实现代码如下:
import pandas as pd # 1. 确保日期为datetime类型 df['Date'] = pd.to_datetime(df['Date']) # 2. 生成每条数据对应的上月参考日期(当前日期减1个月) df['last_month_ref'] = df['Date'] - pd.DateOffset(months=1) # 3. 筛选出所有上月的销售数据,按商品+日期排序 last_month_df = df[ (df['Date'].dt.year == df['last_month_ref'].dt.year) & (df['Date'].dt.month == df['last_month_ref'].dt.month) ].sort_values(by=['Product', 'Date']) # 4. 用merge_asof实现同商品下的最近日期匹配 final_df = pd.merge_asof( # 左表需按匹配键排序 df.sort_values(by=['Product', 'last_month_ref']), last_month_df[['Product', 'Date', 'MTD']], left_on='last_month_ref', right_on='Date', by='Product', direction='backward' # 取<=参考日期的最近日期记录 ) # 5. 整理结果列 final_df = final_df.rename(columns={'MTD_x': 'Current MTD', 'MTD_y': 'Last MTD'}) final_df = final_df[['Date', 'Product', 'Current MTD', 'Last MTD']]
关键逻辑说明
pd.merge_asof:实现需求的核心函数,by='Product'保证仅在同商品内匹配,direction='backward'指定取小于等于参考日期的最大日期记录,正好对应"上月最近有数据的日期"。- 日期筛选:确保只取当前日期对应的上月数据,避免跨月份匹配错误。
- 排序要求:
merge_asof要求左右表都按by字段和日期字段排序,否则无法正确执行匹配逻辑。
效果验证
对应你的两个示例:
- 示例1:2022/10/02的Clothes数据,会自动匹配2022年9月中≤9月2日的最近有销售记录的日期的MTD值。
- 示例2:2022/10/03的Dining room数据,会匹配2022年9月中≤9月3日的最近有销售记录的日期的MTD值。
内容的提问来源于stack exchange,提问作者beginofwork
相关产品推荐
相关产品推荐

