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

Pandas数据处理:按ID分组移除日期间隔小于30天的行

解决同一ID下日期间隔小于30天的行移除问题

嘿,这个需求我之前处理过,咱们一步步来实现你要的效果:

首先,先明确原始数据和需求:我们有下面这个DataFrame,需要移除同一ID下,与同组内已保留行日期间隔小于30天的行,最终保留符合条件的记录。

原始数据定义

import pandas as pd

dfx = pd.DataFrame({
    "ID": ["A", "A", "C", "B", "B"],
    "date": ["01/01/2014", "01/31/2014", "01/23/2014", "01/01/2014", "01/20/2014"]
})

实现步骤

1. 转换日期格式

首先得把字符串类型的date列转换成datetime类型,这样才能计算日期之间的差值:

# 将date列转为datetime格式,指定输入格式为月/日/年
dfx['date'] = pd.to_datetime(dfx['date'], format='%m/%d/%Y')

2. 分组计算日期差并筛选

接下来按ID分组,先对每组内的日期排序,然后计算当前行与前一行的天数差,最后筛选出符合条件的行:

# 按ID和日期排序,确保同一ID内的日期是时间顺序
dfx_sorted = dfx.sort_values(['ID', 'date'])

# 计算每组内当前行与前一行的日期差(单位:天)
dfx_sorted['days_diff'] = dfx_sorted.groupby('ID')['date'].diff().dt.days

# 筛选规则:保留组内第一行(无前置行,days_diff为NaN),或与前一行间隔≥30天的行
filtered_df = dfx_sorted[(dfx_sorted['days_diff'].isna()) | (dfx_sorted['days_diff'] >= 30)]

# 移除临时的days_diff列,得到最终结果
filtered_df = filtered_df.drop('days_diff', axis=1)

# 可选:如果需要恢复原始DataFrame的行顺序,按原始索引排序
filtered_df = filtered_df.sort_index()

最终结果

运行上述代码后,filtered_df就是你要的结果:

ID       date
0  A 2014-01-01
1  A 2014-01-31
2  C 2014-01-23
3  B 2014-01-01

简单解释下逻辑:

  • 排序是为了保证同一ID内的日期按时间先后排列,这样计算的差值才是相邻时间的间隔
  • 组内第一行必然保留,因为没有其他行可以对比
  • 后续行只有和上一个保留的行间隔≥30天才会被保留,刚好符合你定义的“非重复项”规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:47:58