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

如何按CASEID分组偏移DATESTART生成DATEEND,且每组末行保留原日期

解决方案:为日志数据生成DATEEND列

核心需求:对每个CASEID分组,DATEEND取同组下一行的DATESTART;每组最后一行的DATEEND与该行DATESTART保持一致。

输入数据

CASEID   ACTIVITYID DATESTART
725/2022 _0         2022-03-09
725/2022 0F         2022-03-23
725/2022 YB         2022-06-21
725/2022 AA         2022-06-28
725/2022 1F         2022-06-28
725/2022 2B         2022-06-29
444/2022 AA         2022-07-26
444/2022 1F         2022-07-28
444/2022 2B         2022-07-28

实现代码

使用Pandas的groupby+shift(-1)结合fillna即可完成需求,代码如下:

import pandas as pd

# 加载数据(这里模拟输入数据,实际可通过read_csv等方法读取)
df = pd.DataFrame({
    'CASEID': ['725/2022']*6 + ['444/2022']*3,
    'ACTIVITYID': ['_0', '0F', 'YB', 'AA', '1F', '2B', 'AA', '1F', '2B'],
    'DATESTART': ['2022-03-09', '2022-03-23', '2022-06-21', '2022-06-28', '2022-06-28', '2022-06-29', '2022-07-26', '2022-07-28', '2022-07-28']
})

# 1. 按CASEID分组,将DATESTART下移一行得到DATEEND初始值
df['DATEEND'] = df.groupby('CASEID')['DATESTART'].shift(-1)

# 2. 填充每组最后一行的空值,用当前行DATESTART替换
df['DATEEND'] = df['DATEEND'].fillna(df['DATESTART'])

# 打印结果
print(df.to_string(index=False))

输出结果

CASEID   ACTIVITYID DATESTART  DATEEND
725/2022 _0         2022-03-09 2022-03-23
725/2022 0F         2022-03-23 2022-06-21
725/2022 YB         2022-06-21 2022-06-28
725/2022 AA         2022-06-28 2022-06-28
725/2022 1F         2022-06-28 2022-06-29
725/2022 2B         2022-06-29 2022-06-29
444/2022 AA         2022-07-26 2022-07-28
444/2022 1F         2022-07-28 2022-07-28
444/2022 2B         2022-07-28 2022-07-28

关键说明

  • shift(-1)会将每组的DATESTART向下偏移一行,每组最后一行会生成NaN;
  • fillna(df['DATESTART'])直接用当前行的DATESTART填充空值,完美匹配每组最后一行的需求;
  • 若DATESTART是日期类型(非字符串),该方法无需额外修改即可生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 04:55:20