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

求助:基于Group与近3个月付款日期覆盖DataFrame的payer_status字段

解决方案

1. 先把日期列转成可计算的datetime类型

原数据里的last_dt_of_payment是字符串格式,得先转成datetime才能做日期比较:

import pandas as pd
from datetime import datetime
import numpy as np

# 构造你的原始DataFrame
df = pd.DataFrame({
    'Id': ['A1', 'A2', 'A3', 'A4', 'A5', 'A6'],
    'last_dt_of_payment': ['22/08/2022', '21/05/2022', '01/09/2022', '22/01/2022', '26/02/2022', '30/09/2022'],
    'Group': ['x', 'x', 'y', 'y', 'p', 's'],
    'payer_status': [1, 1, 1, 1, 1, 1]
})

# 转换日期列,注意格式是dd/mm/yyyy
df['last_dt_of_payment'] = pd.to_datetime(df['last_dt_of_payment'], format='%d/%m/%Y')

2. 确定「最近3个月」的基准日期

如果你是基于某个固定日期(比如示例里的2022-09-30)计算,直接指定就行;如果要基于当前日期,用pd.DateOffset算严格的3个月前:

# 示例用固定基准日期2022-09-30,往前推3个月
base_date = pd.to_datetime('2022-09-30')
three_months_ago = base_date - pd.DateOffset(months=3)  # 结果是2022-06-30

# 如果是基于当前日期计算:
# three_months_ago = datetime.now() - pd.DateOffset(months=3)

3. 按条件更新payer_status

用np.where嵌套判断,只针对x/y组修改,其他组保持原状态:

# 核心条件:属于x/y组,且付款日期在3个月内
valid_condition = (df['Group'].isin(['x', 'y'])) & (df['last_dt_of_payment'] >= three_months_ago)

# 更新规则:满足条件设1,x/y组不满足设0,非x/y组保留原值
df['payer_status'] = np.where(valid_condition, 1, 
                              np.where(df['Group'].isin(['x', 'y']), 0, df['payer_status']))

最终结果

执行后得到的DataFrame和你期望的完全一致:

Id last_dt_of_payment Group  payer_status
0 A1         2022-08-22     x             1
1 A2         2022-05-21     x             0
2 A3         2022-09-01     y             1
3 A4         2022-01-22     y             0
4 A5         2022-02-26     p             1
5 A6         2022-09-30     s             1

补充提示

用pd.DateOffset(months=3)比直接减90天更准确,因为不同月份天数不一样,比如2月只有28/29天,用月份偏移能精准算到3个月前的同一天。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 19:15:31