【发布时间】:2015-08-12 12:33:35
【问题描述】:
我有一个以时间为索引(1 分钟频率)和几列数据的 pandas DataFrame。有时数据包含 NaN。如果是这样,我只想在间隙不超过 5 分钟时进行插值。在这种情况下,这将是最多 5 个连续的 NaN。数据可能看起来像这样(几个测试用例,显示了问题):
import numpy as np
import pandas as pd
from datetime import datetime
start = datetime(2014,2,21,14,50)
data = pd.DataFrame(index=[start + timedelta(minutes=1*x) for x in range(0, 8)],
data={'a': [123.5, np.NaN, 136.3, 164.3, 213.0, 164.3, 213.0, 221.1],
'b': [433.5, 523.2, 536.3, 464.3, 413.0, 164.3, 213.0, 221.1],
'c': [123.5, 132.3, 136.3, 164.3] + [np.NaN]*4,
'd': [np.NaN]*8,
'e': [np.NaN]*7 + [2330.3],
'f': [np.NaN]*4 + [2763.0, 2142.3, 2127.3, 2330.3],
'g': [2330.3] + [np.NaN]*7,
'h': [2330.3] + [np.NaN]*6 + [2777.7]})
它是这样写的:
In [147]: data
Out[147]:
a b c d e f g h
2014-02-21 14:50:00 123.5 433.5 123.5 NaN NaN NaN 2330.3 2330.3
2014-02-21 14:51:00 NaN 523.2 132.3 NaN NaN NaN NaN NaN
2014-02-21 14:52:00 136.3 536.3 136.3 NaN NaN NaN NaN NaN
2014-02-21 14:53:00 164.3 464.3 164.3 NaN NaN NaN NaN NaN
2014-02-21 14:54:00 213.0 413.0 NaN NaN NaN 2763.0 NaN NaN
2014-02-21 14:55:00 164.3 164.3 NaN NaN NaN 2142.3 NaN NaN
2014-02-21 14:56:00 213.0 213.0 NaN NaN NaN 2127.3 NaN NaN
2014-02-21 14:57:00 221.1 221.1 NaN NaN 2330.3 2330.3 NaN 2777.7
我知道data.interpolate(),但它有几个缺陷,因为它会产生这样的结果,这对 a-e 列有好处,但对于 f-h 列,由于不同的原因它失败了::
a b c d e f g \
2014-02-21 14:50:00 123.5 433.5 123.5 NaN NaN NaN 2330.3
2014-02-21 14:51:00 129.9 523.2 132.3 NaN NaN NaN 2330.3
2014-02-21 14:52:00 136.3 536.3 136.3 NaN NaN NaN 2330.3
2014-02-21 14:53:00 164.3 464.3 164.3 NaN NaN NaN 2330.3
2014-02-21 14:54:00 213.0 413.0 164.3 NaN NaN 2763.0 2330.3
2014-02-21 14:55:00 164.3 164.3 164.3 NaN NaN 2142.3 2330.3
2014-02-21 14:56:00 213.0 213.0 164.3 NaN NaN 2127.3 2330.3
2014-02-21 14:57:00 221.1 221.1 164.3 NaN 2330.3 2330.3 2330.3
h
2014-02-21 14:50:00 2330.300000
2014-02-21 14:51:00 2394.214286
2014-02-21 14:52:00 2458.128571
2014-02-21 14:53:00 2522.042857
2014-02-21 14:54:00 2585.957143
2014-02-21 14:55:00 2649.871429
2014-02-21 14:56:00 2713.785714
2014-02-21 14:57:00 2777.700000
f) 间隔由开始时 4 分钟的 NaN 组成,它们应替换为该值 2763.0(即及时向后推断)
g) 间隔超过 5 分钟,但仍然可以推断出
h) 间隔超过 5 分钟,但仍会插入间隔。
我理解这些原因,当然我没有指定它不应插入超过 5 分钟的间隔。我知道interpolate 只会及时向前推断,但我希望它也能及时向后推断。是否有任何已知的方法可以用来解决我的问题,而无需重新发明轮子?
编辑:
方法data.interpolate 接受输入参数limit,它定义了被插值替换的连续NaN 的最大数量。但这仍然会插入到极限,但在这种情况下,我想继续使用所有 NaN。
【问题讨论】:
-
插值后可以使用
bfill()向后填充方法吗? -
@JohnGalt
bfill()在插值后看起来不错。遗憾的是,它会在超过 5 分钟的间隙中遇到同样的问题,因为它会简单地填充它们。 -
那你期待什么?如果它只有一个值,则不能插值。
-
@JohnGalt 我希望它可以推断,但前提是间隔不超过 5 分钟,即 5 个连续的 NaN。 IE。
bfill修复了案例 f,但没有修复案例 g。 -
@JohnE 是的,我刚刚添加了我对
limit的认识。它几乎完成了工作,因为它在第 5 个值之后停止插值。但如果间隙长于 5 的限制,则根本不应该进行插值。
标签: python pandas interpolation extrapolation