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

Pandas如何高效判断同ID是否存在2个月内非重复日期行并新增布尔列

高效实现方案

针对需求,核心思路是利用Pandas的向量化运算替代嵌套循环,两种常用实现方式如下:

方法1:简洁可读版(适合万行以内数据)

直接通过分组+逐行判断实现,代码逻辑清晰易维护:

import pandas as pd

# 第一步:确保日期列是datetime格式
df['datetime'] = pd.to_datetime(df['datetime'])

# 第二步:按ID分组判断每行是否存在符合要求的同ID其他行
df['has_nearby'] = df.groupby('id')['datetime'].transform(
    lambda group: group.apply(
        lambda cur_date: ((group >= cur_date - pd.DateOffset(months=2)) 
                        & (group <= cur_date + pd.DateOffset(months=2)) 
                        & (group != cur_date)).any()
    )
)

方法2:高性能版(适合十万行以上大数据量)

利用排序后相邻行时间差最小的特性,仅对比相邻行即可完成判断,时间复杂度为O(n log n):

import pandas as pd

# 第一步:确保日期列是datetime格式
df['datetime'] = pd.to_datetime(df['datetime'])

# 第二步:按ID和日期排序,保留原始索引用于结果回贴
df_sorted = df.sort_values(['id', 'datetime']).reset_index(names='original_idx')

# 第三步:计算同ID下当前行与上一行、下一行的时间差
df_sorted['diff_prev'] = df_sorted.groupby('id')['datetime'].diff()
df_sorted['diff_next'] = df_sorted.groupby('id')['datetime'].diff(-1).abs()

# 第四步:判断是否存在相邻行时间差小于2个月
df_sorted['has_nearby'] = (df_sorted['diff_prev'] < pd.DateOffset(months=2)) | (df_sorted['diff_next'] < pd.DateOffset(months=2))

# 第五步:将结果合并回原DataFrame
df = df.merge(
    df_sorted[['original_idx', 'has_nearby']],
    left_index=True,
    right_on='original_idx'
).drop('original_idx', axis=1).reset_index(drop=True)

注意事项

  • 时间差值计算使用pd.DateOffset(months=2)而非固定60天,会自动适配不同月份的天数差异,符合常规业务对「2个月」的定义,若需求为固定60天可替换为pd.Timedelta(days=60)。
  • 若原始数据的日期列已经是datetime64类型,可跳过格式转换步骤进一步提升性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:09:03