【问题标题】:Python pandas: getting session start and end time to calculate session lengthPython pandas:获取会话开始和结束时间以计算会话长度
【发布时间】:2019-08-06 01:02:08
【问题描述】:

我有下面的数据框,它按用户和时间戳排序(为了方便起见,这里写成整数)。

我添加了一个列,它使用 pandas diff() 以分钟为单位给出与上一个活动的时间差。如果它们在 30 分钟内发生,我将它们定义为属于同一会话。查找新会话很容易,因为我可以查看 timediff 是否等于 'NaT' 或大于 30。

d = {'id': [123,  123, 123, 123, 123, 123, 234, 234],
     'activity': ['view','click','click','view','click','view', 'click', 'view'],
     'timestamp': [1, 2,3,4,5,6,1,2],
     'timediff_min': ['NaT',1,36,2,6,124,'NaT',1],
     'new_session': [1,0,1,0,0,1,1,0]}

df = pd.DataFrame(d)
df

这会产生“new_session”列。现在我可以过滤以获取带有会话开始时间戳的数据帧,但我想获取时间戳 能够计算会话长度的最终活动。所以基本上,如果有一个activity session start 和 session end time 将是相同的,但是如果同一个 session 中有多个,则 session start 将是第一个活动,而 session end 将是最后一个活动。下一个会话开始。所以最终的输出会是这样的

d2 = {'id': [123,   123,  123, 234, ],
     'activity': ['view','click','view', 'click'] ,
     'timestamp': [1, 3,6,1],
     'timediff_min': ['NaT',36,124,'NaT'],
     'new_session': [1,1,1,1,],
     'session_start': [1,3,6,1],
     'session_end': [2,5,6,2],}
pd.DataFrame(d2)

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 为什么还要问?之前的解决方案没有解决问题?
  • 这是第2步,第一步是去掉多余的视图,这是获取合法活动的第一个和最后一个时间戳。感谢您对第 1 步的帮助,我将在明天对其进行测试,并在测试时将其标记为已解决。

标签: python pandas session time


【解决方案1】:

我通过以下方法解决了这个问题

d['time_diff'] = d.groupby('id')['timestamp'].diff()
d['new_sess'] = np.where((d.time_diff.isnull()) | (d.time_diff > 'P0DT0H30M0S'), 'yes', 'no')
new_sessions = np.where((d.time_diff.isnull()) | (d.time_diff > 'P0DT0H30M0S'))
d['sess_count'] = np.NaN
d.iloc[new_sessions[0],9] = new_sessions[0]
d.fillna(method='ffill', inplace = True)
d['sess_id'] = d.id + '-' + d.sess_count.astype(int).astype(str)

这会创建唯一的会话 ID,然后我可以将其分组以获得最小和最大时间戳。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-28
    • 2018-05-30
    • 2013-06-04
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    相关资源
    最近更新 更多