Pandas按客户分组计算日期与上一记录日期的间隔天数
问题原因
现有代码逻辑存在3个核心错误,导致输出不符合预期:
- 误用
asfreq('d')做日维度重采样,强行填充两个日期间所有连续日期,生成大量冗余行 - 错误计算日期与当前系统日期的间隔,没有实现「和同组上一条记录日期做差」的需求
- 错误丢弃了
fromDate为空的记录,且排序后没有恢复原始行顺序
正确实现代码
不需要做日期填充、去重操作,直接用分组shift()取同组上一条日期计算间隔即可:
import pandas as pd d = {'customerId': [1, 1, 1, 1, 1, 1, 1, 2], 'fromDate': ['2021-02-22', '2021-03-18', '2021-03-22', '2021-02-10', '2021-09-07', None, '2022-01-18', '2021-05-17'], 'otherInformation': ['Cat', 'Dog', 'Cat', 'Cat', 'Cat', 'Elefant', 'Fish', 'Fish'] } df = pd.DataFrame(data=d) # 保存原始索引,最终输出时恢复原始行顺序 original_index = df.index # 转换日期格式,非法值/空值转为NaT df['fromDate'] = pd.to_datetime(df['fromDate'], errors='coerce') # 按客户ID分组,组内按日期升序排序 df = df.sort_values(['customerId', 'fromDate']) # 取同组上一条记录的日期,计算和当前日期的间隔天数 df['lastInDays'] = (df['fromDate'] - df.groupby('customerId')['fromDate'].shift(1)).dt.days # 两类记录间隔设为None:当前日期为空、组内最早无前置日期的记录 df.loc[df['fromDate'].isna() | df['lastInDays'].isna(), 'lastInDays'] = None # 恢复原始行顺序 df = df.reindex(original_index) # 如需把空值显示为None而非默认NaN,打开下面注释即可 # df['lastInDays'] = df['lastInDays'].apply(lambda x: int(x) if pd.notna(x) else None) print(df)
运行结果
customerId fromDate otherInformation lastInDays 0 1 2021-02-22 Cat 12.0 1 1 2021-03-18 Dog 24.0 2 1 2021-03-22 Cat 4.0 3 1 2021-02-10 Cat None 4 1 2021-09-07 Cat 169.0 5 1 NaT Elefant None 6 1 2022-01-18 Fish 133.0 7 2 2021-05-17 Fish None
注:你给出的期望输出中
2021-03-18对应间隔36天为笔误,该日期与上一个有效日期2021-02-22实际间隔为24天。
内容的提问来源于stack exchange,提问作者Test
相关产品推荐
相关产品推荐

