【问题标题】:Python: how to linearly interpolate monthly data?Python:如何线性插值月度数据?
【发布时间】:2018-08-14 01:21:24
【问题描述】:

我对 python 很陌生,尤其是数据库,所以请原谅任何白痴。

我正在尝试使用 12 个月的每月观察数据集进行练习,数据看起来像这样......

print(data)

2017-04-17  156
2017-05-09  216
2017-06-11  300
2017-07-29  184
2017-08-31  162
2017-09-24   91
2017-10-15  225
2017-11-03  245
2017-12-26  492
2018-01-26  485
2018-02-18  401
2018-03-09  215
2018-04-30  258

这些月度观测值是不规则的(每个月恰好有一个,但时间相差不大)。

现在,我想使用线性插值来获取每个月初的值 -

我尝试了很多方法......并且能够“手动”完成,但我正在尝试掌握 pandas 和 numpy,我知道可以用这些方法完成,这就是到目前为止,我做了一个系列来保存数据,然后我做了:

resampled1 = data.resample('MS')
interp1 = resampled1.interpolate()

print(interp1)

这打印:

2017-04-01   NaN
2017-05-01   NaN
2017-06-01   NaN
2017-07-01   NaN
2017-08-01   NaN
2017-09-01   NaN
2017-10-01   NaN
2017-11-01   NaN
2017-12-01   NaN
2018-01-01   NaN
2018-02-01   NaN
2018-03-01   NaN
2018-04-01   NaN

现在,我知道第一个 2017-4-17 应该是 NaN 作为线性插值(我相信这是默认值),在前后两点之间插值......这是不可能的,因为我没有在 4 月 1 日之前没有数据点。至于其他人......我不确定我做错了什么......可能只是因为我正在努力弄清楚 resample 正在做什么?

【问题讨论】:

  • data.resample('MS').mean() 怎么样?
  • 您必须将数据更改为与时间数据不同的数字格式,然后使用任何类型的插值。你想要一个我想象的时间戳。
  • @coldspeed,这样做似乎会导致数据点被复制,因此 2017-04-01 设置为 156,2017-05-01 设置为 216,等等。即没有插值?

标签: python pandas numpy interpolation


【解决方案1】:

您可能希望resample('D') 进行插值,例如:

In []:
data.resample('D').interpolate().asfreq('MS')

Out[]:
2017-05-01  194.181818
2017-06-01  274.545455
2017-07-01  251.666667
2017-08-01  182.000000
2017-09-01  159.041667
2017-10-01  135.666667
2017-11-01  242.894737
2017-12-01  375.490566
2018-01-01  490.645161
2018-02-01  463.086957
2018-03-01  293.315789
2018-04-01  234.019231

【讨论】:

    【解决方案2】:

    尝试使用RedBlackPy

    from datetime import datetime
    import redblackpy as rb
    
    index = [datetime(2017,4,17), datetime(2017,5,9), datetime(2017,6, 11)]
    values = [156, 216, 300]
    
    series = rb.Series(index=index, values=values, interpolate='linear')
    # Now you can access by any key with no insertion, using interpolation.
    print(series[datetime(2017, 5, 1)]) # prints 194.18182373046875
    

    【讨论】:

      猜你喜欢
      • 2018-07-11
      • 2020-11-30
      • 1970-01-01
      • 2015-06-27
      • 2018-04-12
      • 2012-01-29
      • 1970-01-01
      • 2014-01-02
      • 1970-01-01
      相关资源
      最近更新 更多