识别并删除熊猫时间序列中的无效时间步

时间:2019-03-09 02:28:42

标签: python pandas time-series python-xarray

一段时间以来,我一直在寻找答案,但是找不到任何东西,所以请原谅我是否曾经问过这个问题...

我有一些6个小时的时间序列数据future,其中包含2031-2050年的未来温度预测。查看数据后,我注意到从future.iloc[234]开始的数据集中存在一些错误的时间增量:

future.iloc[220:281]

        time                    Temp
220     2031-03-28 00:00:00     68.276657
221     2031-03-28 06:00:00     68.270706
222     2031-03-28 12:00:00     68.264748
223     2031-03-28 18:00:00     68.258781
224     2031-03-29 00:00:00     68.252808
225     2031-03-29 06:00:00     68.246849
226     2031-03-29 12:00:00     68.240883
227     2031-03-29 18:00:00     68.234909
228     2031-03-30 00:00:00     68.228943
229     2031-03-30 06:00:00     68.222984
230     2031-03-30 12:00:00     68.217010
231     2031-03-30 18:00:00     68.211052
232     2031-03-31 00:00:00     68.205093
233     2031-03-31 06:00:00     68.199120
234     2031-03-31 12:00:00     68.193153
235     2031-02-26 00:00:00     68.187195
236     2031-02-26 06:00:00     68.181236
237     2031-02-26 12:00:00     68.175270
238     2031-02-26 18:00:00     68.169304
239     2031-02-27 00:00:00     68.163322
240     2031-02-27 06:00:00     68.169304
....
369     2031-03-31 12:00:00     68.193153
370     2031-03-31 18:00:00     68.258781
371     2031-04-01 00:00:00     67.950096
372     2031-04-01 06:00:00     67.949493
373     2031-04-01 12:00:00     67.949539
374     2031-04-01 18:00:00     67.950241
375     2031-04-02 00:00:00     67.951591
376     2031-04-02 06:00:00     67.953590
377     2031-04-02 12:00:00     67.955589
378     2031-04-02 18:00:00     67.957596
379     2031-04-03 00:00:00     67.959595
380     2031-04-03 06:00:00     67.961601

该数据集在此blob之后以正确的时间增量继续,但似乎重复了整整一个月的数据(即future.iloc[370] = 2031-03-31 18:00:00,应该是future.iloc[234]之后的下一个时间步,并继续有效的数据从这一点开始。)我知道该数据(重复的月份除外)是有效的,因此,如果可以的话,我需要尝试挽救这些数据。我有许多这样的数据集,所以现在我担心它们中的时间步长也会出错。

我的目标是检查两点之间的时间增量不一致,或者删除具有无效时间增量的行:

        time                    Temp
220     2031-03-28 00:00:00     68.276657
221     2031-03-28 06:00:00     68.270706
222     2031-03-28 12:00:00     68.264748
223     2031-03-28 18:00:00     68.258781
224     2031-03-29 00:00:00     68.252808
225     2031-03-29 06:00:00     68.246849
226     2031-03-29 12:00:00     68.240883
227     2031-03-29 18:00:00     68.234909
228     2031-03-30 00:00:00     68.228943
229     2031-03-30 06:00:00     68.222984
230     2031-03-30 12:00:00     68.217010
231     2031-03-30 18:00:00     68.211052
232     2031-03-31 00:00:00     68.205093
233     2031-03-31 06:00:00     68.199120
234     2031-03-31 12:00:00     68.193153
235     2031-03-31 18:00:00     68.258781
236     2031-04-01 00:00:00     67.950096
237     2031-04-01 06:00:00     67.949493
238     2031-04-01 12:00:00     67.949539
239     2031-04-01 18:00:00     67.950241
240     2031-04-02 00:00:00     67.951591
241     2031-04-02 06:00:00     67.953590
242     2031-04-02 12:00:00     67.955589
243     2031-04-02 18:00:00     67.957596
244     2031-04-03 00:00:00     67.959595
245     2031-04-03 06:00:00     67.961601

或将与无效时间增量关联的所有数据为空:

        time                    Temp
220     2031-03-28 00:00:00     68.276657
221     2031-03-28 06:00:00     68.270706
222     2031-03-28 12:00:00     68.264748
223     2031-03-28 18:00:00     68.258781
224     2031-03-29 00:00:00     68.252808
225     2031-03-29 06:00:00     68.246849
226     2031-03-29 12:00:00     68.240883
227     2031-03-29 18:00:00     68.234909
228     2031-03-30 00:00:00     68.228943
229     2031-03-30 06:00:00     68.222984
230     2031-03-30 12:00:00     68.217010
231     2031-03-30 18:00:00     68.211052
232     2031-03-31 00:00:00     68.205093
233     2031-03-31 06:00:00     68.199120
234     2031-03-31 12:00:00     68.193153
235     2031-02-26 00:00:00     NaN
236     2031-02-26 06:00:00     NaN
237     2031-02-26 12:00:00     NaN
238     2031-02-26 18:00:00     NaN
239     2031-02-27 00:00:00     NaN
240     2031-02-27 06:00:00     NaN
....
369     2031-03-31 12:00:00     NaN
370     2031-03-31 18:00:00     68.258781
371     2031-04-01 00:00:00     67.950096
372     2031-04-01 06:00:00     67.949493
373     2031-04-01 12:00:00     67.949539
374     2031-04-01 18:00:00     67.950241
375     2031-04-02 00:00:00     67.951591
376     2031-04-02 06:00:00     67.953590
377     2031-04-02 12:00:00     67.955589
378     2031-04-02 18:00:00     67.957596
379     2031-04-03 00:00:00     67.959595
380     2031-04-03 06:00:00     67.961601

我无法完全解决的真正问题是,仅 future.iloc[235]是无效的时间增量。 future.iloc[236:270]在技术上仍是正确的6H时间步长,它们只是被抵消了,从而导致重复。因此,要完全删除无效数据,我需要同时确定无效的时间间隔和创建重复数据的有效时间间隔

我试图用pd.date_range(start=future.iloc[0].time, end=future.iloc[-1].time, freq='6H')创建一个比较日期范围,并遍历我的行以查找错误的值。但是,我还无法提出一种解决方案,该解决方案实际上可以识别并删除有问题的行。

关于如何执行此操作的任何想法?我以为大熊猫会为类似的东西提供一些内置功能,但是还没有找到适合我需求的实质性东西。

奖金:我尝试执行的每项检查似乎都需要花费几分钟才能遍历大约30,000行数据。这样的行数是否可以保证此时间使用情况可以迭代?

1 个答案:

答案 0 :(得分:0)

确定错误可能是为了进行这种测试:

1)您按天分组 2)您使用数字项目> 0和<4来捕获该组 3)您有错误列表,可以删除相应的行

errorlist=[]
def f(g):
    if g.shape[0] > 0 and g.shape[0] < 4:
        errorlist.append(g.index[0])
df.set_index('time').groupby(pd.Grouper(freq='D')).apply(f)

print(errorlist)