【问题标题】:What is the best way to remove interpolation from a time series data in Pandas?从 Pandas 的时间序列数据中删除插值的最佳方法是什么?
【发布时间】:2018-03-18 03:18:14
【问题描述】:

有没有更好的方法从 pandas 数据框中的时间序列数据中删除插值数据?

我有一个时间序列数据,其中缺失值用插值填充,但我想删除插值数据,然后再次用 np.nan 值替换。

输入数据:

Index                   Column_one     Column_two     
2017:10:03 03:44:00     13.61504936     14.65000057
2017:10:03 03:45:00     13.61504936     14.65000057
2017:10:03 03:46:00     13.61504936     14.65000057
2017:10:03 03:47:00     13.61504936     np.nan
2017:10:03 03:48:00     13.60000038     np.nan
2017:10:03 03:49:00     np.nan          np.nan
2017:10:03 03:50:00     np.nan          np.nan
2017:10:03 03:51:00     np.nan          np.nan
2017:10:03 03:52:00     np.nan          14.80000019
2017:10:03 03:53:00     np.nan          14.80000019
2017:10:03 03:54:00     14.21253681     14.80000019
2017:10:03 03:55:00     14.24253273     14.80000019

所有缺失值都用插值填充

data_interpolated = data.interpolate()

插值数据:

Index                   Column_one     Column_two     
2017:10:03 03:44:00     13.61504936     14.65000057
2017:10:03 03:45:00     13.61504936     14.65000057
2017:10:03 03:46:00     13.61504936     14.65000057
2017:10:03 03:47:00     13.61504936     14.67500051
2017:10:03 03:48:00     13.60000038     14.70000044
2017:10:03 03:49:00     13.70208979     14.72500038
2017:10:03 03:50:00     13.80417919     14.75000032
2017:10:03 03:51:00     13.9062686      14.77500025
2017:10:03 03:52:00     14.008358       14.80000019
2017:10:03 03:53:00     14.11044741     14.80000019
2017:10:03 03:54:00     14.21253681     14.80000019
2017:10:03 03:55:00     14.24253273     14.80000019

现在我想删除插值并获取初始数据集。

所需的输出:

Index                   Column_one     Column_two     
2017:10:03 03:44:00     13.61504936     14.65000057
2017:10:03 03:45:00     13.61504936     14.65000057
2017:10:03 03:46:00     13.61504936     14.65000057
2017:10:03 03:47:00     13.61504936     np.nan
2017:10:03 03:48:00     13.60000038     np.nan
2017:10:03 03:49:00     np.nan          np.nan
2017:10:03 03:50:00     np.nan          np.nan
2017:10:03 03:51:00     np.nan          np.nan
2017:10:03 03:52:00     np.nan          14.80000019
2017:10:03 03:53:00     np.nan          14.80000019
2017:10:03 03:54:00     14.21253681     14.80000019
2017:10:03 03:55:00     14.24253273     14.80000019

如果有什么好的方法可以在 Pandas 或 Numpy 中实现,请告诉我?

【问题讨论】:

  • 抱歉,缺失值是如何填写的?你能不能不首先填写它们是我的问题。如果没有原始 df 的副本,回到原始 df 是一个非常重要的问题,您如何判断数据是否以线性方式合法增加而不是被插值?
  • @EdChum 缺失值是通过线性插值技术填充的,所以所有填充值都是线性递增的。我得到的数据实际上是插值数据,我想得到原始数据集。所以基本上我想删除所有以线性方式增加或减少的数据点(这可能会删除原始df中也具有线性关系的数据)
  • 也许您可以添加一个计算差异的列,然后搜索差异为线性的区域(| [i] - [i-1] | < 0.03 或类似的东西)并将这些值替换为 np.nan

标签: python python-3.x numpy time-series interpolation


【解决方案1】:

我可以这样培养你:

for i in xrange(df.__len__()):
    if i == 0:
        continue
    df.loc[i, ('lin_one')] = df.loc[i, ('one')] - df.loc[i - 1, ('one')]
    df.loc[i, ('lin_two')] = df.loc[i, ('two')] - df.loc[i - 1, ('two')]

for i in xrange(df.__len__()-1):
    if df.lin_one[i] - df.lin_one[i+1] != 0 and df.lin_one[i] - df.lin_one[i+1] < 0.003:
        df.loc[i,('one')] = np.nan
    if df.lin_two[i] - df.lin_two[i+1] != 0 and df.lin_two[i] - df.lin_two[i+1] < 0.003:
        df.loc[i,('two')] = np.nan

这将产生以下输出:

                  index        one   lin_one        two  lin_two
0   2017:10:03 03:44:00  13.615049  0.000000  14.650001    0.000
1   2017:10:03 03:45:00  13.615049  0.000000  14.650001    0.000
2   2017:10:03 03:46:00  13.615049  0.000000        NaN    0.000
3   2017:10:03 03:47:00  13.615049  0.000000        NaN    0.025
4   2017:10:03 03:48:00        NaN -0.015049        NaN    0.025
5   2017:10:03 03:49:00        NaN  0.102089        NaN    0.025
6   2017:10:03 03:50:00        NaN  0.102089        NaN    0.025
7   2017:10:03 03:51:00        NaN  0.102089        NaN    0.025
8   2017:10:03 03:52:00        NaN  0.102089  14.800000    0.025
9   2017:10:03 03:53:00        NaN  0.102089  14.800000    0.000
10  2017:10:03 03:54:00  14.212537  0.102089  14.800000    0.000
11  2017:10:03 03:55:00  14.242533  0.029996  14.800000    0.000

那么你可以删除计算列lin_onelin_two

del df['lin_one']
del df['lin_two']

但是这种方法会杀死一个未插值数据的值...

【讨论】:

  • 它适用于小样本,但如果我适用于整个数据它不准确。以及为什么要使用 0.03 的任何理由?
  • 我只有上面提供的样本数据。没有使用0.03 的具体原因,只是一个可以根据您的需要进行调整的起始值。您可以根据输出进行调整。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 2022-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多