大熊猫的时间序列分析

时间:2014-05-21 14:34:28

标签: python pandas time-series

我有一个包含网站访问量的Pandas DataFrame,我有两列ID号,日期格式为YYYY-mm-dd HH:mm:ss。我想得到一个数据框,其中包含客户访问之间的时差。我找到了如何使用GROUPBY获取访问次数,但我不知道其余的。

有人可以帮我吗?

编辑:

No.      IDs      date
 1      4678     2012-11-30 23:59:59
 2      4703     2012-11-30 23:59:23
 3      4678     2012-11-30 23:58:46
 4      5803     2012-11-30 23:58:19
 5      4678     2012-11-30 23:58:07

我想获得每个ID号码

      Visit_number      duration since last visit
4678        1                    0
            2                    73s
            3                    39s

目前我只设法使用array.groupby([' ID'])计算每个ID号的访问次数.size()

2 个答案:

答案 0 :(得分:0)

如下所示:

import pandas as pd
import datetime

a = pd.read_csv("a.csv")
a.date = a.date.map(lambda s: datetime.datetime.strptime(s, "%Y-%m-%d %H:%M:%S"))
for user_id, series in a.sort("date").groupby("id"):
    print user_id, series.date.diff()

输出:

4678 4        NaT
2   00:00:39
0   00:01:13
Name: date, dtype: timedelta64[ns]
4703 1   NaT
Name: date, dtype: timedelta64[ns]
5803 3   NaT
Name: date, dtype: timedelta64[ns]

答案 1 :(得分:0)

要计算访问次数,您可以使用groupby和cumcount

In [76]: df['Visit_Number'] = df.groupby('IDs').cumcount() + 1

接下来,在此期间,您可以为每个组使用diff

In [77]: df['duration'] = - df.groupby('IDs')['date'].diff()


In [78]: df
Out[78]: 
    IDs                date  Visit_Number  duration
0  4678 2012-11-30 23:59:59             1       NaT
1  4703 2012-11-30 23:59:23             1       NaT
2  4678 2012-11-30 23:58:46             2  00:01:13
3  5803 2012-11-30 23:58:19             1       NaT
4  4678 2012-11-30 23:58:07             3  00:00:39

这为您提供timedelta的差异,以秒为单位填写NaN值:

In [79]: df['duration'] = df['duration'].astype('timedelta64[s]').fillna(0)

In [80]: df
Out[80]: 
    IDs                date  Visit_Number  duration
0  4678 2012-11-30 23:59:59             1         0
1  4703 2012-11-30 23:59:23             1         0
2  4678 2012-11-30 23:58:46             2        73
3  5803 2012-11-30 23:58:19             1         0
4  4678 2012-11-30 23:58:07             3        39