首页 文章

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

提问于
浏览
1

我有一个数据框,包含许多天的时间序列数据,这些数据是全天定期抽样的网站点击总数 . 每个新的一天,计数重置为零 . 因此,在第一天结束时,计数已达到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

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

2 回答

  • 2

    你真的在问一些contigiuous组(而不是标准的groupby,它忽略了同一组中的项是否是相邻的)所以我认为你需要使用diff:

    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
    

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

    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
    
  • 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
    

相关问题