按特定条件计算同一账户客户两行记录的日期差值
计算客户状态变更时的暂停天数
要解决这个问题,核心是按账户+客户分组追踪状态变化,精准计算从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
相关产品推荐
相关产品推荐

