【问题标题】:Identifying and removing invalid time steps in a pandas time series识别和删除 pandas 时间序列中的无效时间步
【发布时间】:2019-07-31 02:08:57
【问题描述】:

我为此寻找了一段时间的答案,但一直没有找到任何东西,所以如果之前有人问过这个问题,请原谅我......

我有一些 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

数据集在此 blip 之后以正确的时间增量继续,但似乎重复了整整一个月的数据(即 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

或 null 所有与无效时间增量相关的数据:

        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') 创建比较日期范围,并遍历我的行以查找错误值。但是,我还没有想出一个能够真正识别和删除错误行的解决方案。

关于如何做到这一点的任何想法?我以为 pandas 会为类似的东西提供一些内置功能,但一直找不到适合我需要的实质性内容。

奖励:我尝试过的每一次检查似乎都需要花费一分钟来处理大约 30,000 行数据。这个行数是否保证这次使用迭代?

【问题讨论】:

  • “删除错误的行,或将与这些行关联的所有数据归零”到底是什么意思?当发现不一致的 timedelta 时,您想要删除日期在同一天的行?
  • @jmiguel 是的,以及与无效时间增量相关的任何数据。我在我的问题中添加了一些信息,希望能进一步澄清这一点。

标签: python pandas time-series python-xarray


【解决方案1】:

要识别错误可能需要做这样的测试:

1) 你按天分组 2)你用数字项目> 0和

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)

【讨论】:

    猜你喜欢
    • 2020-05-26
    • 2022-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 2019-10-23
    • 1970-01-01
    • 2012-07-29
    相关资源
    最近更新 更多