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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 04:39:20