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

基于日期阈值的Pandas DataFrame分组累计增量列实现问题

Pandas按组生成累计间隔标识列diff_weeks

原始DataFrame

num_IDstart_dateend_dateother_column
12022-02-142022-02-1509:23:00
12022-02-202022-02-2512:10:01
22022-03-112022-03-2108:21:00
22022-03-222022-03-2702:36:00
22022-04-102022-04-1511:43:03
32022-02-042022-02-0616:51:00
32022-02-142022-02-2319:35:10
32022-03-052022-03-0621:05:13
42022-02-282022-10-1200:01:00

需求说明

按num_ID分组新增diff_weeks列:

  • 每组首行值为0
  • 其余行:若同组前一行的end_date与当前行start_date间隔≥7天,则diff_weeks = 前一行值 +1;否则保持前一行值

预期结果

num_IDstart_dateend_dateother_columndiff_weeks
12022-02-142022-02-1509:23:000
12022-02-202022-02-2512:10:010
22022-03-112022-03-2108:21:000
22022-03-222022-03-2702:36:000
22022-04-102022-04-1511:43:031
32022-02-042022-02-0616:51:000
32022-02-142022-02-2319:35:101
32022-03-052022-03-0621:05:132
42022-02-282022-10-1200:01:000

原代码问题

使用以下代码时,既未实现累计求和逻辑,还抛出TypeError: unsupported operand type(s) for -: 'datetime.date' and 'float'错误:

df['diff_weeks'] = (df['start_date'].sub(df.groupby('num_ID')['end_date'].shift())
                     .ge('7d').astype(int)
                    )

错误原因:

  • 分组shift后每组首行产生float类型的NaN,导致日期与float类型相减报错
  • 仅生成了0/1的间隔标识列,未实现“满足条件累计加1”的需求

正确实现方案

步骤1:确保日期列类型正确

先将start_date和end_date转换为datetime类型(若原始数据还不是):

import pandas as pd

df['start_date'] = pd.to_datetime(df['start_date'])
df['end_date'] = pd.to_datetime(df['end_date'])

步骤2:生成累计间隔标识列

通过分组计算日期差、生成间隔标识,再按组累计求和:

# 计算间隔标识并按组累计求和
df['diff_weeks'] = (
    (df['start_date'] - df.groupby('num_ID')['end_date'].shift()).dt.days >= 7
).astype(int).groupby(df['num_ID']).cumsum()

代码解释

  1. df.groupby('num_ID')['end_date'].shift():按组将end_date下移一行,每组首行得到NaN
  2. (df['start_date'] - ...).dt.days >=7:计算当前行start_date与前一行end_date的天数差,判断是否≥7,生成布尔值
  3. astype(int):将布尔值转为0/1(False→0,True→1)
  4. groupby(df['num_ID']).cumsum():按组对0/1序列累计求和,自动实现“满足条件加1,否则保持原值”的逻辑;每组首行的NaN经过cumsum后自动变为0,符合需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 04:10:38