Python 熊猫合并具有相同开始和结束时间的行

Python 熊猫合并具有相同开始和结束时间的行,python,database,pandas,time-series,data-science,Python,Database,Pandas,Time Series,Data Science,我有一个文件,里面有几个来自wifi接入的数据。数据库分为多列:用户id、开始(当设备连接到路由器时)、结束(当设备断开与路由器的连接时) 例如: user_id start end 1 15/05/16 13:51 15/05/16 14:06 1 15/05/16 14:06 15/05/16 14:32 1 15/05/16 14:32 15/05/16 14:34 2 15/05/16 11:14 15/05/16 11:25 2 15/

我有一个文件,里面有几个来自wifi接入的数据。数据库分为多列:用户id、开始(当设备连接到路由器时)、结束(当设备断开与路由器的连接时)

例如:

user_id   start     end 
1   15/05/16 13:51  15/05/16 14:06 
1   15/05/16 14:06  15/05/16 14:32 
1   15/05/16 14:32  15/05/16 14:34 
2   15/05/16 11:14  15/05/16 11:25 
2   15/05/16 11:25  15/05/16 12:09 
2   15/05/16 12:14  15/05/16 12:42 
2   15/05/16 17:33  15/05/16 17:41 
2   15/05/16 17:41  15/05/16 18:27
问题是,有时设备会断开并重新连接。我希望在以下情况下对数据进行分组:

user_id start   end
1   15/05/16 13:51  15/05/16 14:34
2   15/05/16 11:14  15/05/16 12:42
2   15/05/16 17:33  15/05/16 18:27

有没有一种有效的方法来处理熊猫呢?

我们可以做这样的事情

import pandas as pd
data=pd.DataFrame(
    [
        [1,'15/05/16 13:51','15/05/16 14:06'],
        [1,'15/05/16 14:06','15/05/16 14:32'], 
        [1,'15/05/16 14:32','15/05/16 14:34'], 
        [2,'15/05/16 11:14','15/05/16 11:25'],
        [2,'15/05/16 11:25','15/05/16 12:09'],
        [2,'15/05/16 12:14','15/05/16 12:42'],
        [2,'15/05/16 17:33','15/05/16 17:41'], 
        [2,'15/05/16 17:41','15/05/16 18:27']
    ]
    ,columns=['userid','start','end']
)

from datetime import datetime
data['start']=data['start'].map(lambda x: datetime.strptime(x,'%d/%m/%y %H:%M'))
data['end']=data['end'].map(lambda x: datetime.strptime(x,'%d/%m/%y %H:%M'))

diffData=[]
for i in range(1, len(data)):
    diffData.append((data.loc[i,'start'] - data.loc[i-1,'end']).seconds / 60)

data['diff']=[0] + diffData

def getStartEnd(tempData,THRESHOLD):
    tempData=tempData.reset_index()
    finalData=[]
    startTime=tempData.loc[0,'start']
    for i in range(1,len(tempData)):
        if(tempData.loc[i,'diff'] > THRESHOLD):
            finalData.append([tempData.loc[i,'userid'],startTime,tempData.loc[i-1,'end']])
            startTime=tempData.loc[i,'start']
    finalData.append([tempData.loc[i,'userid'],startTime,tempData.loc[i,'end']])
    return(pd.DataFrame(finalData,columns=['userid','start','end']))

finalData=pd.DataFrame(columns=['userid','start','end'])
for user in data['userid'].unique():
    finalData=pd.concat([finalData,getStartEnd(data[data['userid']==user],60)])

print(finalData)

  userid               start                 end
0      1 2016-05-15 13:51:00 2016-05-15 14:34:00
0      2 2016-05-15 11:14:00 2016-05-15 12:42:00
1      2 2016-05-15 17:33:00 2016-05-15 18:27:00

您可以对用户id使用pandas Groupby函数,一旦您分离了每个用户id数据,就可以计算开始和结束之间的差异。然后将累加和应用于单独的组,然后可以提取每个组的第一行开始和最后一行结束:-)


首先,我们需要有正确格式的列:“开始”和“结束”:

df[['start']] =pd.to_datetime(df['start'])
df[['end']] =pd.to_datetime(df['end'])
然后,您需要生成一个新列来标识不同连接的条件:

df['id_connection'] = False
indexes = df.drop_duplicates(subset='user_id', keep='first').index
df.loc[indexes,'id_connection'] = True
下一步是识别新用户的第一次观察(它将始终是一个新连接):

现在,我们需要确定产生新连接时的另一个条件。您需要使用标准来确定它是否为新连接:

diff_ = (df['start'].values[1:] - df['end'].values[:-1]).astype('float')
time_criteria_mins = 5
new_connection = np.insert(( diff_ / (60*10**9)) > time_criteria_mins, 0, 1)
然后,您需要结合这两个条件,(1)新用户(2)连接间隔大于5分钟的同一用户:

df['id_connection'] = (new_connection | df['id_connection']).cumsum()
最后,我们通过属性“id\u connection”创建一个组:

gb = df.groupby('id_connection').agg({'user_id': 'first', 'start': 'first','end':'last'})
注意:为确保数据帧按(用户和开始日期时间)排序,请谨慎

df['id_connection'] = (new_connection | df['id_connection']).cumsum()
gb = df.groupby('id_connection').agg({'user_id': 'first', 'start': 'first','end':'last'})