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

如何在Pandas中按ID筛选早于最新日期30天的时间序列行?

解决方案:按ID筛选早于最新日期30天的记录

这是个很常见的分组日期筛选需求,我一步步给你拆解实现步骤,保证清晰易懂:

步骤1:准备数据并转换日期类型

首先我们先把你提供的示例数据构造成DataFrame,同时把字符串格式的Date列转换成Pandas的datetime类型——这是做日期运算的前提:

import pandas as pd

# 构造示例数据
df = pd.DataFrame({
    'Date': ['2019/03/27', '2019/04/27', '2019/04/27', '2019/04/28', '2019/01/27', '2019/08/27'],
    'ID': [1, 2, 1, 1, 2, 2],
    'Temp': [23, 32, 42, 41, 33, 23]
})

# 转换日期列到datetime类型
df['Date'] = pd.to_datetime(df['Date'])

步骤2:获取每个ID的最新测量日期

我们需要按ID分组,找出每个ID对应的最新(最大)日期。这里推荐用transform方法,能直接给每一行匹配对应ID的最新日期,省去合并数据的步骤:

# 给每行添加对应ID的最新日期,生成辅助列
df['Latest_Date'] = df.groupby('ID')['Date'].transform('max')

步骤3:筛选符合条件的行

现在只需要判断每行的Date是否比对应ID的Latest_Date早至少30天,然后筛选出符合条件的记录,最后删掉辅助列即可:

# 筛选:日期 <= 最新日期 - 30天
result = df[df['Date'] <= df['Latest_Date'] - pd.Timedelta(days=30)]

# 移除辅助列,还原成原数据结构
result = result.drop(columns='Latest_Date')

最终结果

运行完上面的代码,你会得到和预期完全一致的DataFrame:

Date  ID  Temp
0 2019-03-27   1    23
1 2019-04-27   2    32
4 2019-01-27   2    33

如果你觉得用transform的方式有点抽象,也可以用groupby+merge的方式实现,逻辑是一样的:

# 先计算每个ID的最新日期
latest_dates = df.groupby('ID')['Date'].max().reset_index(name='Latest_Date')
# 合并到原数据
df_with_latest = df.merge(latest_dates, on='ID')
# 筛选并移除辅助列
result = df_with_latest[df_with_latest['Date'] <= df_with_latest['Latest_Date'] - pd.Timedelta(days=30)].drop(columns='Latest_Date')

两种方法都能得到相同的结果,选你觉得顺手的就行~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:09:08