熊猫从日数开始创建时间序列

时间:2014-06-03 16:47:45

标签: python pandas time-series

我有一个数据框,其中包含全天定期抽样的网站点击总数的多天时间序列数据。每个新的一天,计数重置为零。因此,在第一天结束时,计数已达到9次点击。然后在第2天,计数再次从0开始,并在当天结束时达到8次点击......等等

day    value    time
------------------------
1        0      00:45:00
1        5      02:15:00
1        8      06:55:00
1        9      13:10:00
2        0      00:10:00
2        1      01:00:00
2        7      05:15:00     
2        8      11:45:00 
3        0      03:00:00
3        4      07:30:00
3        7      15:30:00

我想将各个日子聚合在一起,形成一个累积的时间序列。

day    value    time
------------------------
1        0      00:45:00
1        5      02:15:00
1        8      06:55:00
1        9      13:10:00
2        9      00:10:00
2        10     01:00:00
2        16     05:15:00     
2        17     11:45:00 
3        17     03:00:00
3        21     07:30:00
3        24     15:30:00

Pandas有办法有效地做到这一点吗? 非常感谢你的帮助。

2 个答案:

答案 0 :(得分:2)

你真的在询问有争议的群体(而不是标准的群体,而忽略了同一群体中的物品是否相邻)所以我认为你需要使用差异:

In [11]: df['day'].diff().astype(bool)
0     True
1    False
2    False
3    False
4     True
5    False
6    False
7     True
8    False
9    False
Name: day, dtype: bool

注意:NaN转换为True!如果您可以保证每个组都是非空的并且每次都在增加,那么astype(bool)也不是绝对必要的。

然后,您可以将其乘以相应的(最后)值:

In [12]: previous = (df.day.diff() * df['value'].shift())

In [13]: previous
Out[13]:
0   NaN
1     0
2     0
3     0
4     9
5     0
6     0
7     8
8     0
9     0
dtype: float64

我可能只是将第一个值设置为0(您可以使用fillna(0)作为单行):

In [14]: previous.iloc[0] = 0

现在,添加这个的结果可以得到你想要的结果:

In [15]: df['value'] + previous.cumsum()
Out[15]:
0     0
1     5
2     8
3     9
4    10
5    16
6    17
7    17
8    21
9    24
dtype: float64

答案 1 :(得分:0)

我会做那样的事情

import pandas as pd

df=pd.DataFrame({'day':[1, 1, 1, 1, 2, 2, 2 , 3, 3, 3],\
                'value':[0 ,5 ,8 ,9 ,1 ,7 ,8 ,0 ,4 ,7]})
# Evaluate the offset to add
dd=df.groupby('day').max().cumsum()
df.set_index('day',inplace=True)
# Creation of offset dataframe
dd.index += 1
# Delete the last row
dd=dd[0:-1]
# Evaluate the first row
dd=dd.append(pd.DataFrame({'value':[0]},index=[df.index[0]]))
# Perform the addition
df = df.add(dd)

导致

   value
1      0
1      5
1      8
1      9
2     10
2     16
2     17
3     17
3     21
3     24
相关问题