【问题标题】:Rolling mean on pandas data frame timeseries熊猫数据帧时间序列的滚动平均值
【发布时间】:2017-08-03 16:47:16
【问题描述】:

我正在使用 Pandas 处理一些时间序列数据。我有以下格式的数据框:

               Date      Time  Reading
552726   2016/08/01   0: 0: 0    17.28
552727   2016/08/01   0: 0: 5    17.28
552728   2016/08/01   0: 0:10    17.21
552729   2016/08/01   0: 0:15    17.16
552730   2016/08/01   0: 0:20    17.11
552731   2016/08/01   0: 0:25    17.08
552732   2016/08/01   0: 0:30    17.18
552733   2016/08/01   0: 0:35    17.18
etc...

我想对 Reading 列进行平均,这样它需要一个 10 分钟的窗口并计算平均值,我想在时间序列中移动这个窗口。然后我想用新的平均值和时间戳来更新数据框,所以它看起来像这样:

           Date       Time      Reading
552726   2016/08/01   0: 0: 0    17.30
552727   2016/08/01   0: 10:0    17.35
552728   2016/08/01   0: 20:0    17.20
etc...

在 Pandas 中执行此操作的最佳方法是什么?我尝试了滚动平均方法为滚动窗口设置频率。但是我必须自己重建数据框,使用新的时间戳,我认为有一种更清洁、更简单的方法来做到这一点。

谢谢,如果我能更好地说明问题,请告诉我。

【问题讨论】:

  • 你是否总是每 5 秒观察一次?
  • 是的。采样率为 1 个样本/5 秒
  • 那你为什么不用120观察滚动窗口呢?
  • 我试过了,但它没有更新日期和时间。它计算平均值,但不会更新我的数据框。我基本上得到了一堆 NAN,然后是平均值。所以我必须拉出这些,并创建一个具有适当时间戳的新系列。我想知道是否有更好的方法来做到这一点。

标签: python-2.7 pandas


【解决方案1】:

根据您的数据,假设我想计算 15 秒间隔的平均值。 我只是做了:

#frame contains your data  
n_obs = 3
result = frame.rolling(window = n_obs, min_periods = 1).mean().iloc[::n_obs,:]

#          Date     Time    Reading
# 0  2016/08/01  0: 0: 0  17.280000
# 3  2016/08/01  0: 0:15  17.216667
# 6  2016/08/01  0: 0:30  17.123333 

主要的“技巧”是选择 n_obs 的观测倍数。

这应该对您使用 n_obs = 120 有效,尽管这意味着计算的平均值比您实际需要的要多。

【讨论】:

  • 很高兴它有帮助。如果您发现答案有用,还可以考虑投票;)我发现的一个问题是时间的表示形式,小时和分钟有 1 位或 2 位数字。这在转换为日期时间时会出现问题……如果有用的话,我这样做了“ messy" 行以良好的格式获取时间(如示例中的列表,但您可以轻松转换为 pandas 系列)。你可以用它来理解每一步 time = frame.Time.values.tolist() time = map(lambda x: ":".join(x), [map(lambda x: "{0:0>2} ".format(x), el.split(":")) for el in map(lambda x: x.replace(" ", ""), time)])
  • 谢谢。我是熊猫新手。这就是我正在做的事情,但我仍然习惯使用 iloc 方法进行索引。
猜你喜欢
  • 1970-01-01
  • 2013-03-24
  • 2020-01-15
  • 1970-01-01
  • 2018-06-20
  • 2019-07-27
  • 2017-09-12
相关资源
最近更新 更多