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

如何获取dataframe中列值发生变更对应的生效日期

实现方案

核心逻辑为按用户分组后按时间排序,识别value字段的变更节点,对应赋值生效日期:

  1. 先按id、name分组,对每个用户的所有记录按filedate升序排序,保证时序正确
  2. 标记value和上一行不一致的变更行,每个用户的首条记录默认作为首个生效节点
  3. 首条记录的生效日期取startdate,后续所有变更行的生效日期取对应行的filedate
  4. 提取指定字段输出结果即可

示例实现代码(基于pandas):

import pandas as pd

# 第一步:先将日期字段转为标准日期格式,原始数据的df命名为raw_df
raw_df['filedate'] = pd.to_datetime(raw_df['filedate'])
raw_df['startdate'] = pd.to_datetime(raw_df['startdate'])

# 第二步:按用户+文件日期排序
sorted_df = raw_df.sort_values(by=['id', 'name', 'filedate']).reset_index(drop=True)

# 第三步:标记value发生变更的行
sorted_df['value_changed'] = sorted_df.groupby(['id', 'name'])['value'].diff().ne(0)

# 第四步:筛选出每个用户的首条记录+所有变更行
result_df = sorted_df[(sorted_df['value_changed']) | (sorted_df.groupby(['id', 'name']).cumcount() == 0)].copy()

# 第五步:赋值生效日期
result_df['effective date'] = result_df.apply(
    lambda x: x['startdate'] if sorted_df.loc[x.name-1, 'id'] != x['id'] else x['filedate'],
    axis=1
)

# 第六步:提取要求的输出字段
result_df = result_df[['id', 'name', 'effective date', 'value']].reset_index(drop=True)

注意事项

  • 若value为字符串等非数值类型,将标记变更行的代码替换为 sorted_df['value_changed'] = sorted_df.groupby(['id', 'name'])['value'].shift().ne(sorted_df['value']) 即可兼容
  • 若存在同一用户同一filedate下多条重复value的记录,可先执行 raw_df = raw_df.drop_duplicates(subset=['id', 'name', 'filedate', 'value']) 去重,避免生成冗余生效记录

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 13:36:05