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

Pandas技术问题:修正变更记录中的结束日期

问题:为DataFrame中同ID的变更记录自动填充enddate

我有一个DataFrame,用于记录某条记录随时间的所有变更。该DataFrame包含记录id(非唯一,用于追踪同一条记录的多次变更)、startdate和enddate字段。enddate仅在已知/预设时存在,通常为空。我希望将每条变更记录的enddate设置为同id下一条记录的startdate。

示例初始DataFrame

from datetime import date
import pandas as pd

thing = pd.DataFrame([
    {'id':1,'startdate':date(2021,1,1),'enddate':date(2022,1,1)},
    {'id':1,'startdate':date(2021,3,24),'enddate':None},
    {'id':1,'startdate':date(2021,5,26),'enddate':None},
    {'id':2,'startdate':date(2021,2,2),'enddate':None},
    {'id':2,'startdate':date(2021,11,26),'enddate':None}
])

print(thing)

输出:

id   startdate     enddate
0   1  2021-01-01  2022-01-01
1   1  2021-03-24        None
2   1  2021-05-26        None
3   2  2021-02-02        None
4   2  2021-11-26        None

该DataFrame已按记录创建时间戳和id排序。我尝试了以下代码:

thing['enddate'] = thing.groupby('id')['startdate'].apply(lambda x: x.shift())

但上述代码仅处理了12万条数据中的约1万条,大部分本应生成enddate的行未被处理。

期望结果

print(thing)

输出:

id   startdate     enddate
0   1  2021-01-01  2021-03-24
1   1  2021-03-24  2021-05-26
2   1  2021-05-26        None
3   2  2021-02-02  2021-11-26
4   2  2021-11-26        None

完成该转换后,即可明确各配置生效的时间区间。


解决方案

核心问题分析

你之前的代码逻辑有误:x.shift()默认是向上偏移1位,取的是同ID组内上一条记录的startdate,和需求中“取同ID下一条记录的startdate”完全相反。同时,apply(lambda x: x.shift())属于非矢量化操作,处理大数量级数据时效率低下,容易出现部分数据未处理的情况。

正确实现代码

使用pandas内置的矢量化分组偏移操作,直接取同ID组内下一条记录的startdate:

# 按ID分组,将startdate向下偏移1位(取同ID下一条的startdate)
thing['enddate'] = thing.groupby('id')['startdate'].shift(-1)

效果说明

  • shift(-1)会将组内的startdate列向下偏移1位,每条记录的enddate自动对应同ID下一条记录的startdate
  • 组内最后一条记录因为没有下一条数据,enddate会被设为None,完全符合需求
  • 矢量化操作效率极高,能轻松处理12万条级别的数据,不会出现部分数据未处理的问题

运行上述代码后,即可得到你期望的DataFrame结果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:10:33