2016-11-07 1 views
1

Ich versuche eine Methode zur Berechnung der Sitzungsdauer zu finden. Meine Beispieldaten sind unten. Ich habe die Annahme gemacht, dass, wenn sich jemand wieder anmeldet, eine neue Sitzung beginnt und somit die vorherige Sitzung beendet sein sollte. Daher werde ich die Anmeldung über die Aktion verwenden, bevor sich der Benutzer erneut als Sitzungsdauer anmeldet.Python finde den Unterschied zwischen Daten in einer Pandasäule?

Action,Duration,_time,User 
getForeignBugs,3,2016-11-07 15:45:18.992,savaithi 
getServiceRequests,5,2016-11-07 15:45:18.902,savaithi 
login,8088,2016-11-07 15:45:18.804,savaithi 
getAuditTrail,550,2016-11-07 15:45:10.627,savaithi 
getEnclosures,447,2016-11-07 15:45:09.994,savaithi 
login,4810,2016-11-07 15:45:09.040,savaithi 
getNoteTemplates,2,2016-11-07 15:45:04.220,savaithi 
getQuickSearchInitInfo2,3,2016-11-07 15:45:01.995,savaithi 
getQuickSearchInitInfo,3,2016-11-07 15:45:01.873,savaithi 
login,0,2016-11-07 15:45:00.979,savaithi 
getUserPreferences,2,2016-11-07 15:45:00.958,savaithi 
getUserPreferences,2,2016-11-07 15:45:00.956,savaithi 
SecurityServiceImpl.constructFromSession,2,2016-11-07 15:45:00.954,savaithi 
setBooleanPreference,2,2016-11-07 15:45:00.954,savaithi 
login,0,2016-11-07 15:45:00.658,savaithi 
getPreference,1,2016-11-07 15:45:00.582,savaithi 
getUserPreferences,129,2016-11-07 15:44:52.376,savaithi 
login,2,2016-11-07 15:44:52.246,savaithi 

Wie würde ich dynamisch auf Daten zwischen Login und Login zugreifen [index-1]?

für unter Beispiel mag ich getPreference,1,2016-11-07 15:45:00.582 verwenden - login,2,2016-11-07 15:44:52.246

login,0,2016-11-07 15:45:00.658,savaithi 
getPreference,1,2016-11-07 15:45:00.582,savaithi 
getUserPreferences,129,2016-11-07 15:44:52.376,savaithi 
login,2,2016-11-07 15:44:52.246,savaithi 

Antwort

2

IIUC können Sie es auf diese Weise tun:

lassen Sie sich zuerst die DF sortieren:

In [71]: x = df.sort_values(['User','_time']).reset_index() 

In [72]: x 
Out[72]: 
    index         Action Duration     _time  User 
0  17          login   2 2016-11-07 15:44:52.246 savaithi 
1  16      getUserPreferences  129 2016-11-07 15:44:52.376 savaithi 
2  15        getPreference   1 2016-11-07 15:45:00.582 savaithi 
3  14          login   0 2016-11-07 15:45:00.658 savaithi 
4  12 SecurityServiceImpl.constructFromSession   2 2016-11-07 15:45:00.954 savaithi 
5  13      setBooleanPreference   2 2016-11-07 15:45:00.954 savaithi 
6  11      getUserPreferences   2 2016-11-07 15:45:00.956 savaithi 
7  10      getUserPreferences   2 2016-11-07 15:45:00.958 savaithi 
8  9          login   0 2016-11-07 15:45:00.979 savaithi 
9  8     getQuickSearchInitInfo   3 2016-11-07 15:45:01.873 savaithi 
10  7     getQuickSearchInitInfo2   3 2016-11-07 15:45:01.995 savaithi 
11  6       getNoteTemplates   2 2016-11-07 15:45:04.220 savaithi 
12  5          login  4810 2016-11-07 15:45:09.040 savaithi 
13  4        getEnclosures  447 2016-11-07 15:45:09.994 savaithi 
14  3        getAuditTrail  550 2016-11-07 15:45:10.627 savaithi 
15  2          login  8088 2016-11-07 15:45:18.804 savaithi 
16  1      getServiceRequests   5 2016-11-07 15:45:18.902 savaithi 
17  0       getForeignBugs   3 2016-11-07 15:45:18.992 savaithi 

jetzt einzigen lassen Filer diese Zeilen, in denen Action == 'login' oder diejenigen, wo next.Action == 'login', plus die letzte Zeile

In [34]: x.loc[(x.Action == 'login') | (x.Action.shift(-1) == 'login') | (x.index == x.index[-1])] 
Out[34]: 
    index    Action Duration     _time  User 
0  17    login   2 2016-11-07 15:44:52.246 savaithi 
2  15  getPreference   1 2016-11-07 15:45:00.582 savaithi 
3  14    login   0 2016-11-07 15:45:00.658 savaithi 
7  10 getUserPreferences   2 2016-11-07 15:45:00.958 savaithi 
8  9    login   0 2016-11-07 15:45:00.979 savaithi 
11  6 getNoteTemplates   2 2016-11-07 15:45:04.220 savaithi 
12  5    login  4810 2016-11-07 15:45:09.040 savaithi 
14  3  getAuditTrail  550 2016-11-07 15:45:10.627 savaithi 
15  2    login  8088 2016-11-07 15:45:18.804 savaithi 
17  0  getForeignBugs   3 2016-11-07 15:45:18.992 savaithi 

In [35]: x.loc[(x.Action == 'login') | (x.Action.shift(-1) == 'login') | (x.index == x.index[-1]), '_time'].diff() 
Out[35]: 
0    NaT 
2 00:00:08.336000 
3 00:00:00.076000 
7 00:00:00.300000 
8 00:00:00.021000 
11 00:00:03.241000 
12 00:00:04.820000 
14 00:00:01.587000 
15 00:00:08.177000 
17 00:00:00.188000 
Name: _time, dtype: timedelta64[ns] 
+0

Ja! Das sieht genau so aus, wie ich es versucht habe. Und viel einfacher auch. Danke Max! – anshanno

+0

Jetzt, da ich darauf eingehe, ist die Antwort etwas aus - musste nach der Aufnahme von 'df3.loc [(df3.Action == 'login') | (df3.Action.shift (-1) == 'Login') | (df3.index == df3.index [-1]), '_time']. diff() 'zu einem neuen Spaltennamen. Ich benutzte: 'df3.session_duration = df3.session_duration.shift (-1)' nach um die Sitzungsdauer mit der Anmeldung anstatt mit der Aktion zu verlängern. Danke für die Hilfe! Sieht so aus, als müsste ich etwas in 'loc' einlesen - habe es vorher nie wirklich benutzt. – anshanno

Verwandte Themen