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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 07:10:29