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

如何基于用户登录DataFrame识别7天内3次独立登录的用户?

解决留存用户识别问题:找出7天周期内有3次不同日期登录的用户

嘿,这个问题我熟!咱们用Pandas一步步来解决,思路清晰又高效:

第一步:数据预处理

首先得把时间戳转换成可处理的datetime格式,并且提取出日期部分(因为同一天多次登录只算一次):

import pandas as pd

# 转换时间戳为datetime类型
df['time_stamp'] = pd.to_datetime(df['time_stamp'])
# 提取日期列,用于后续去重和分析
df['date'] = df['time_stamp'].dt.date

第二步:用户登录日期去重

同一个用户同一天多次登录,我们只需要保留一个日期记录:

# 按用户分组,获取每个用户的唯一登录日期列表
user_unique_dates = df.drop_duplicates(subset=['user_id', 'date']).sort_values(['user_id', 'date'])

第三步:识别留存用户(核心逻辑)

我们需要判断:是否存在一个7天的窗口,该用户在窗口内有至少3个不同的登录日期。这里推荐用Pandas的滚动窗口功能,简洁又高效:

# 对每个用户,计算7天滚动窗口内的登录日期数量
user_unique_dates['rolling_7d_count'] = user_unique_dates.groupby('user_id')['date'].rolling(
    window='7D',  # 窗口大小为7天
    on='date'     # 基于date列计算窗口
).count().reset_index(level=0, drop=True)

# 筛选出至少有一次窗口内登录日期>=3的用户
adopted_users = user_unique_dates[user_unique_dates['rolling_7d_count'] >= 3]['user_id'].unique().tolist()

验证你的示例数据

咱们来对应你给的数据看看结果:

  • 用户1的登录日期:2013-01-01、01-03、01-06、01-10 → 前三个日期都在2013-01-01到2013-01-07这个7天窗口内,符合条件
  • 用户2只有1次登录,不符合
  • 用户3的登录日期:01-04、01-05、01-11 → 01-04到01-11间隔7天,没有7天窗口能包含3个日期,不符合
  • 用户4的登录日期:01-04、01-05、01-12 → 同样没有符合条件的7天窗口,不符合

最终结果adopted_users就是[1],完全符合预期。

另一种手动判断的思路(适合理解逻辑)

如果你想手动实现窗口判断,可以写一个辅助函数,遍历每个用户的登录日期,检查是否存在三个日期的时间差≤6天(因为7天周期内,最早和最晚日期的差最多6天):

def check_adopted(dates):
    sorted_dates = sorted(dates)
    # 遍历所有连续三个日期的组合
    for i in range(len(sorted_dates) - 2):
        if (sorted_dates[i+2] - sorted_dates[i]).days <= 6:
            return True
    return False

# 应用函数到每个用户
user_dates_summary = df.groupby('user_id')['date'].unique().reset_index()
user_dates_summary['is_adopted'] = user_dates_summary['date'].apply(check_adopted)
adopted_users = user_dates_summary[user_dates_summary['is_adopted']]['user_id'].tolist()

这个方法和滚动窗口的结果一致,适合用来理解背后的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:34:59