我是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'计数列)及其持续时间值?
答案 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()
})