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

Pandas技术问题:筛选4天窗口内有2次访问的用户ID

解决思路与修正代码

你的需求是找出存在至少两次访问间隔在4天窗口内的用户ID,原代码没得到正确结果主要有两个核心问题:一是日期列还是字符串格式,Pandas无法识别为时间维度来计算窗口;二是rolling窗口的逻辑没有基于正确的时间类型执行。下面是具体的修正方案:

方案一:计算相邻日期差值(直观高效)

这个方法直接针对"两次访问间隔≤4天"的核心需求,逻辑更清晰:

import pandas as pd

# 先把字符串日期转为Pandas可识别的datetime类型
df['date_of_visit'] = pd.to_datetime(df['date_of_visit'], format='%m/%d/%y')

# 按用户分组,检查是否存在相邻访问间隔≤4天的情况
target_users = df.groupby('user_id').filter(
    lambda x: (x['date_of_visit'].sort_values().diff().dt.days <= 4).any()
).user_id.unique()

print(target_users)  # 输出: [1]

方案二:修正rolling窗口逻辑(适配你的原思路)

如果想沿用rolling的思路,需要先修复日期类型问题,同时调整窗口参数:

import pandas as pd

# 转换日期格式是前提
df['date_of_visit'] = pd.to_datetime(df['date_of_visit'], format='%m/%d/%y')

# 分组后先排序日期,再用时间窗口检查是否有≥2条记录的情况
target_users = df.groupby('user_id').filter(
    lambda x: x.sort_values('date_of_visit')
               .set_index('date_of_visit')
               .rolling('4D')  # 大写D表示自然日,小写d是工作日,这里用大写更符合需求
               .count()
               .gt(1)
               .any()
).user_id.unique()

print(target_users)  # 输出: [1]

原代码失效的原因

  1. 日期类型错误:date_of_visit是字符串时,set_index后的索引是字符串序列,rolling('4d')无法解析为时间窗口,只会按行号做滑动窗口,完全偏离了时间间隔的计算逻辑。
  2. 未排序日期:如果用户的访问日期未排序,rolling窗口的计算顺序会混乱,导致错误的计数结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:12:54