【问题标题】:Pandas create time series from day counts熊猫根据天数创建时间序列
【发布时间】:2014-07-24 02:42:59
【问题描述】:

我有一个数据框,其中包含多天的时间序列数据,这些数据是全天定期采样的网站点击总数。计数在每个新的一天重置为零。所以在第一天结束时,点击次数已经达到了 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 有办法有效地做到这一点吗? 非常感谢您的帮助。

【问题讨论】:

  • 它看起来不像你在聚合任何东西。检查您的预期输出并解释您是如何获得这些值的。
  • 感谢您的回复,汤姆。在第 1 天结束时,值计数高达 9,所以我希望第 2 天从 9 开始计数,就像在第二个输出中一样,而不是像在第一个输出中那样为零。我将编辑问题以更清楚地阅读。

标签: python pandas time-series


【解决方案1】:

您实际上是在询问连续组(而不是标准 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

现在,添加 this 的 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

【讨论】:

    【解决方案2】:

    我会做这样的事情

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2014-07-20
      • 1970-01-01
      • 2018-12-15
      • 1970-01-01
      相关资源
      最近更新 更多