【问题标题】:Pandas form groups by closeness of timestampsPandas 通过时间戳的接近程度形成分组
【发布时间】:2018-07-06 01:05:36
【问题描述】:

我有一个由以下代码生成的数据框:

l_dates = ['2017-01-01 19:53:36',
           '2017-01-01 19:54:36',
           '2017-01-03 18:15:13',
           '2017-01-03 18:18:11',
           '2017-01-03 18:44:35',
           '2017-01-07 12:50:48']

l_ids = list(range(len(l_dates)))

l_values = [x*1000-1 for x in l_ids]

l_data = list(zip(l_dates, l_ids, l_values))

df1_ = pd.DataFrame(data = l_data, columns = ['timeStamp', 'usageid', 'values'])

在这个版本中如下所示

             timeStamp  usageid  values
0  2017-01-01 19:53:36        0      -1
1  2017-01-01 19:54:36        1     999
2  2017-01-03 18:15:13        2    1999
3  2017-01-03 18:18:11        3    2999
4  2017-01-03 18:44:35        4    3999
5  2017-01-07 12:50:48        5    4999

我想根据紧密结合的观察结果组成小组。例如,应将 15 分钟时间间隔内的所有观测值组合在一起。

我知道我可以按如下方式以成对的方式识别这些观察结果

df_user10241['timeStamp']  < pd.Timedelta(minutes=15)

但是,我没有设法将它们分组。我得到如下数据框:

             timeStamp  usageid  values   session
0  2017-01-01 19:53:36        0      -1  Session1
1  2017-01-01 19:54:36        1     999  Session1
2  2017-01-03 18:15:13        2    1999  Session2
3  2017-01-03 18:18:11        3    2999  Session2
4  2017-01-03 18:44:35        4    3999  Session3
5  2017-01-07 12:50:48        5    4999  Session4

非常感谢,如果您需要更多信息,请告诉我。

【问题讨论】:

    标签: python python-3.x pandas pandas-groupby


    【解决方案1】:

    你需要cumsum

    'Session'+(df.timeStamp.diff().fillna(0)/np.timedelta64(15, 'm')).gt(1).cumsum().add(1).astype(str)
    Out[959]: 
    0    Session1
    1    Session1
    2    Session2
    3    Session2
    4    Session3
    5    Session4
    Name: timeStamp, dtype: object
    

    分配回来后

    df['Session']='Session'+(df.timeStamp.diff().fillna(0)/np.timedelta64(15, 'm')).gt(1).cumsum().add(1).astype(str)
    df
    Out[961]: 
                timeStamp  usageid  values   Session
    0 2017-01-01 19:53:36        0      -1  Session1
    1 2017-01-01 19:54:36        1     999  Session1
    2 2017-01-03 18:15:13        2    1999  Session2
    3 2017-01-03 18:18:11        3    2999  Session2
    4 2017-01-03 18:44:35        4    3999  Session3
    5 2017-01-07 12:50:48        5    4999  Session4
    

    【讨论】:

    • 哇,太棒了!你能再解释一下吗。我想我不明白/np.timedelta64(15, 'm')然后gt(1)这两个是做什么的?
    • @clog14 计算 timedelta 中包含多少 15 分钟,超过 1(意味着 15 分钟)应该属于下一组:-)
    • 好的,谢谢我知道了。 :-) 还有两个简短的问题: 1. 我想没有直接的方法可以用 groupby 做到这一点,对吧? 2. 如果我有一个更复杂的数据框,其中包含另一个级别的客户,我可以将此解决方案传递给客户的 groupby 操作,对吗?
    • @clog14 是的,您可以分组并将以上所有内容传递给 lambda :-)
    • 谁能回答下面的问题,类似于这个问题,但分组不是基于亲密关系。 stackoverflow.com/questions/60965602/…
    猜你喜欢
    • 2022-01-24
    • 2019-07-17
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多