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

如何在pandas中按账户标记缺失的起始/结束日期

Pandas 账户新增/流失标记实现方案

核心逻辑

标记规则完全基于全局日期边界和单账户的记录日期范围判断,不需要复杂操作:

  • 先计算全数据集的全局最早日期、全局最晚日期作为统计周期的边界
  • 按账户维度分组,统计每个账户自身第一条记录的日期、最后一条记录的日期
  • 两个标记的判断规则:
    • 新增账户:账户首条记录日期晚于全局最早日期,说明统计周期起始日该账户无记录,是周期内新进入的
    • 不再存续账户:账户末条记录日期早于全局最晚日期,说明统计周期截止日该账户无记录,周期结束前已无有效记录

代码实现

首先构造和描述一致的样例数据,包含3个测试账户,其中账户2缺失首日记录、账户3缺失末日记录:

import pandas as pd

# 构造样例数据
df = pd.DataFrame([
    {"Account": 1, "Date": "2022-03-01", "Balance": 100},
    {"Account": 1, "Date": "2022-03-02", "Balance": 120},
    {"Account": 1, "Date": "2022-03-03", "Balance": 90},
    {"Account": 2, "Date": "2022-03-02", "Balance": 200},
    {"Account": 2, "Date": "2022-03-03", "Balance": 210},
    {"Account": 3, "Date": "2022-03-01", "Balance": 300},
    {"Account": 3, "Date": "2022-03-02", "Balance": 350},
])

# 务必先将日期列转为datetime格式,避免字符串比较出错
df["Date"] = pd.to_datetime(df["Date"])

接下来计算边界值、打标记:

# 计算全局统计周期的首尾日期
global_start_date = df["Date"].min()
global_end_date = df["Date"].max()

# 按账户分组,取每个账户的首条、末条记录日期
acc_period = df.groupby("Account")["Date"].agg(
    acc_first_date="min",
    acc_last_date="max"
).reset_index()

# 将账户维度的日期信息合并回原明细表
df = df.merge(acc_period, on="Account", how="left")

# 生成两个标记列
df["is_new_account"] = df["acc_first_date"] > global_start_date
df["is_inactive_account"] = df["acc_last_date"] < global_end_date

# 清理中间辅助列
df = df.drop(columns=["acc_first_date", "acc_last_date"])

结果验证

运行代码后输出的结果符合预期:

  • 账户1全周期都有记录,两个标记均为False,属于周期内存量活跃账户
  • 账户2所有记录的is_new_account均为True,属于周期内新增账户
  • 账户3所有记录的is_inactive_account均为True,属于周期内已停止存续的账户

提示:如果业务场景中允许账户偶发漏报、需要连续缺失N天才判定为不再存续,可以在分组统计账户末条记录日期后,额外增加日期差判断逻辑,调整阈值即可适配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:06:31