Python中

时间:2016-02-06 13:22:15

标签: python pandas grouping

我是Python数据科学的初学者。我正在研究点击流数据,想要找出会话的持续时间。为此,我找到了会话的开始时间和结束时间。但是在减法方面,我的答案也是错误的。 这是数据

       Sid                    Tstamp     Itemid  Category
0        1  2014-04-07T10:51:09.277Z  214536502         0
1        1  2014-04-07T10:54:09.868Z  214536500         0
2        1  2014-04-07T10:54:46.998Z  214536506         0
3        1  2014-04-07T10:57:00.306Z  214577561         0
4        2  2014-04-07T13:56:37.614Z  214662742         0
5        2  2014-04-07T13:57:19.373Z  214662742         0
6        2  2014-04-07T13:58:37.446Z  214825110         0
7        2  2014-04-07T13:59:50.710Z  214757390         0
8        2  2014-04-07T14:00:38.247Z  214757407         0
9        2  2014-04-07T14:02:36.889Z  214551617         0
10       3  2014-04-02T13:17:46.940Z  214716935         0
11       3  2014-04-02T13:26:02.515Z  214774687         0
12       3  2014-04-02T13:30:12.318Z  214832672         0

我在代码中提到了这个问题 - Timestamp Conversion

这是我的代码 -

k.columns=['Sid','Tstamp','Itemid','Category']
k=k.loc[:,('Sid','Tstamp')]

#Find max timestamp
idx=k.groupby(['Sid'])['Tstamp'].transform(max) == k['Tstamp'] 
ah=k[idx].reset_index()

#Find min timestamp
idy=k.groupby(['Sid'])['Tstamp'].transform(min) == k['Tstamp']
ai=k[idy].reset_index()

#grouping by Sid and applying count to retain the distinct Sid values
kgrp=k.groupby('Sid').count()

i=0
for temp1,temp2 in zip(ah['Tstamp'],ai['Tstamp']):
    sv1= datetime.datetime.strptime(temp1, "%Y-%m-%dT%H:%M:%S.%fZ")
    sv2= datetime.datetime.strptime(temp2, "%Y-%m-%dT%H:%M:%S.%fZ")
    d1=time.mktime(sv1.timetuple()) + (sv1.microsecond / 1000000.0)
    d2=time.mktime(sv2.timetuple()) + (sv2.microsecond / 1000000.0)
    kgrp.loc[i,'duration']= d1-d2   
    i=i+1

这是输出。

 
kgrp
Out[5]: 
      Tstamp  duration
Sid                   
1          4   359.275
2          6   745.378
3          3  1034.468

对于会话ID 2,持续时间应该接近6分钟但是我差不多12分钟。我估计我在这里犯了一些愚蠢的错误。

此外,我正在通过Sid进行分组并对其应用计数以获取Sid列并将每个持续时间存储为单独的列。有没有更简单的方法可以存储仅Sid(不是'Tstamp'计数列)及其持续时间值?

1 个答案:

答案 0 :(得分:1)

您将持续时间值分配给错误的标签。 在您的测试数据中,sid从1开始,但i从0开始:

# for sid 1, i == 0
kgrp.loc[i,'duration']= d1-d2
i=i+1

<强>更新

一种更加pythonic的方法来处理这个问题:)

def calculate_duration(dt1, dt2):
    # do the calculation here, return the duration in seconds

k = k.loc[:, ('Sid', 'Tstamp')]
result = k.groupby(['Sid'])['Tstamp'].agg({
    'Duration': lambda x: calculate_duration(x.max(), x.min()),
    'Count': lambda x: x.count()
})