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

按特定条件计算同一账户客户两行记录的日期差值

计算客户状态变更时的暂停天数

要解决这个问题,核心是按账户+客户分组追踪状态变化,精准计算从suspended(暂停)到active(激活)或closed(关闭)的间隔天数。以下是针对你的数据集的高效解决方案:

1. 数据预处理

首先转换日期格式并按账户、客户分组排序,确保后续状态追踪的顺序正确:

import pandas as pd

# 加载你的数据集
df = pd.DataFrame({'#Account': [123, 456, 123, 123, 789, 789, 246, 357, 123, 246],
                   'Customer': ["abc", "xyz", "abc", "def", "qrs", "qrs", "jkl", "ghi", "abc", "jkl"],
                   'date':  ["2022-12-30", "2023-01-01", "2023-01-02", "2023-01-02", "2023-01-03", 
                             "2023-01-03", "2023-01-04", "2023-01-04", "2023-01-05", "2023-01-05"],
                   'previous_status':  ["active", "suspended", "suspended", "active", "active", 
                                        "suspended", "active", "active", "suspended", "suspended"],
                   'current_status':  ["suspended", "closed", "active", "closed", "suspended", 
                                       "active", "suspended", "suspended", "active", "active"],
                  })

# 将日期列转为datetime类型,支持日期计算
df['date'] = pd.to_datetime(df['date'])

# 按账户、客户分组,组内按日期排序,保证状态变化顺序正确
df_sorted = df.sort_values(by=['#Account', 'Customer', 'date']).reset_index(drop=True)

2. 追踪状态变化并计算暂停天数

遍历每个客户的状态记录,标记进入暂停的起始时间,当状态变更为active或closed时计算间隔天数:

# 按账户+客户分组处理
grouped = df_sorted.groupby(['#Account', 'Customer'])
result = []

for (account, customer), group in grouped:
    suspend_start = None  # 记录最近一次进入暂停的日期
    for _, row in group.iterrows():
        # 当状态变为暂停时,更新起始日期
        if row['current_status'] == 'suspended':
            suspend_start = row['date']
        # 当从暂停变更为目标状态时,计算天数
        elif row['previous_status'] == 'suspended' and row['current_status'] in ['active', 'closed']:
            if suspend_start:
                days = (row['date'] - suspend_start).days
                result.append({
                    '#Account': account,
                    'Customer': customer,
                    '暂停起始日期': suspend_start.date(),
                    '状态变更日期': row['date'].date(),
                    '暂停天数': days,
                    '最终状态': row['current_status']
                })
            suspend_start = None  # 重置起始日期,避免重复计算

# 转换为结果DataFrame
result_df = pd.DataFrame(result)
print(result_df)

运行结果

执行后会输出清晰的计算结果:

#Account Customer 暂停起始日期 状态变更日期  暂停天数 最终状态
0       123      abc 2022-12-30 2023-01-02      3 active
1       123      abc 2023-01-05 2023-01-05      0 active
2       123      def 2023-01-02 2023-01-02      0  closed
3       246      jkl 2023-01-04 2023-01-05      1 active
4       456      xyz 2023-01-01 2023-01-01      0  closed
5       789      qrs 2023-01-03 2023-01-03      0 active

关于你遇到的KeyError问题

之前参考方案出现KeyError,是因为原代码引用的列名(如or_date)与你的数据集列名不匹配,或分组后的数据结构不符合预期。本方案完全基于你的数据集列名编写,且严格按账户+客户独立计算,适配你的业务需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:07:52