Python 熊猫通过时间戳的接近程度来分组

Python 熊猫通过时间戳的接近程度来分组,python,python-3.x,pandas,pandas-groupby,Python,Python 3.x,Pandas,Pandas Groupby,我有一个由以下代码生成的数据帧: 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_dat

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

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)

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

您需要
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.如果我有一个更compex的dataframe,它有另一个级别,比如客户,我可以将此解决方案传递给客户上的groupby操作,对吗?@clog14是的,您可以分组并将以上所有内容传递给lambda:-)有人可以回答以下问题吗,类似于这个问题,但分组不是基于接近程度。
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