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

如何用Pandas按用户分组处理日期,确保起始不早于2023年1月1日

处理用户日期数据:强制最早日期不早于2023年1月1日

需求说明

需要对用户的日期数据按以下规则处理:

  • 若用户已有2023年1月1日的数据,保留该行及之后的所有行,删除该日期之前的行;
  • 若用户没有2023年1月1日的数据,但存在早于该日期的行,将用户最早的那一行日期修改为2023年1月1日,保留其他行;
  • 若用户所有行的日期都晚于2023年1月1日,直接保留原数据。

源数据

USERDateValue
USER101/06/20221000
USER101/01/20231000
USER101/02/20231200
USER102/02/20231300
USER201/06/20211000
USER201/02/20231200
USER202/02/20231250
USER302/06/20231250

数据初始化代码

import pandas as pd

df = pd.DataFrame({
    "USER": ['USER1', 'USER1', 'USER1', 'USER1', 'USER2', 'USER2', 'USER2', 'USER3'],
    "Date": ['01/06/2022', '01/01/2023', '01/02/2023', '02/02/2023', '01/06/2021', '01/02/2023', '02/02/2023', '02/06/2023'],
    "Value": ['1000', '1000', '1200', '1300', '1000', '1200', '1250', '1250'],
})

解决方案代码

# 转换日期列为datetime类型,适配原数据的MM/DD/YYYY格式
df['Date'] = pd.to_datetime(df['Date'], format='%m/%d/%Y')
target_date = pd.to_datetime('2023-01-01')

def process_group(group):
    # 筛选出日期不晚于目标日期的行
    filtered = group[group['Date'] >= target_date]
    if filtered.empty:
        # 所有行都早于目标日期,修改第一行的日期
        modified_first = group.iloc[[0]].copy()
        modified_first['Date'] = target_date
        # 合并修改后的第一行与剩余行
        return pd.concat([modified_first, group.iloc[1:]])
    else:
        # 存在符合要求的行,直接保留筛选结果
        return filtered

# 按用户分组处理后合并结果
result_df = df.groupby('USER', group_keys=False).apply(process_group)

# 将日期转回原格式,重置索引
result_df['Date'] = result_df['Date'].dt.strftime('%m/%d/%Y')
result_df = result_df.reset_index(drop=True)

处理后结果

USERDateValue说明
USER101/01/20231000保留该行,删除之前的行
USER101/02/20231200
USER102/02/20231300
USER201/01/20231000将原2021年6月1日的日期改为2023年1月1日
USER201/02/20231200
USER202/02/20231250
USER302/06/20231250保留原数据,日期晚于2023年1月1日

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 06:41:32