首页 > 解决方案 > 在行之间的差异大于一定数量的地方放置 NaN

问题描述

我正在尝试修复方向值(0-360 度)的时间序列数据集,其中点跳跃一定量并在我的图中导致垂直线。为了解决这个问题,我想将 NaN 放在这些位置,这样它们就不会绘图。数据帧包含某个时间跨度的站点和变量。看起来像这样:

In [1]: windData
Out[1]: 
                          Stat1       Stat2  ...      Stat71      Stat72
0                                            ...                        
2018-09-09 06:00:00  137.733582  179.545227  ...    4.856323    4.842651
2018-09-09 06:10:00  137.886902  180.022339  ...   10.627319    9.420166
2018-09-09 06:20:00  138.012634  180.438965  ...   25.765625   24.234741
2018-09-09 06:30:00  138.112305  180.758179  ...   32.981506   31.843384
2018-09-09 06:40:00  138.188080  180.958557  ...   36.052368   35.299866
                        ...         ...  ...         ...         ...
2018-09-26 02:10:00   86.973267   85.516541  ...  142.261230  142.418396
2018-09-26 02:20:00   87.188538   85.504944  ...  142.298218  342.455444
2018-09-26 02:30:00   87.430664   85.490173  ...  142.367004  342.524658
2018-09-26 02:40:00   87.697632   85.472290  ...  142.469055  342.628265
2018-09-26 02:50:00   87.988037   85.451538  ...  142.606628  342.768311

[2430 rows x 72 columns]

我想将 NaN 放置在给定时间步长和下一个时间步长之间的差异大于 180 的地方。我尝试过几种方法,一种是在整个数据帧上进行,然后第二种方法是打开基于我希望绘制的电台的选择。我不确定哪个更有效,因为我最终将遍历所有站点并绘制每个站点。

无论哪种方式,我都尝试过使用df.diff()来获取差异,然后我曾经df.mask(180 < df)将 NaN 放置在我想要它们的位置,但是我不确定如何从那里开始并将“新”数据集中的所有 NaN 转换为“ original' 实际值在哪里。这是我使用单个站点执行此操作的代码:

In [1]: df = windData[:][StationNum]

In [2]: df.head(12)
Out[2]: 
0
2018-09-09 06:00:00    143.0
2018-09-09 06:10:00    141.0
2018-09-09 06:20:00    132.0
2018-09-09 06:30:00    147.0
2018-09-09 06:40:00    127.0
2018-09-09 06:50:00    139.0
2018-09-09 07:00:00    146.0
2018-09-09 07:10:00    118.0
2018-09-09 07:20:00    167.0
2018-09-09 07:30:00     50.0
2018-09-09 07:40:00    360.0
2018-09-09 07:50:00     52.0
Name: 41002, dtype: float64

In [3]: dfDif = abs(df.diff())

In [4]:dfDif.head(12)
Out[4]: 
0
2018-09-09 06:00:00      NaN
2018-09-09 06:10:00      2.0
2018-09-09 06:20:00      9.0
2018-09-09 06:30:00     15.0
2018-09-09 06:40:00     20.0
2018-09-09 06:50:00     12.0
2018-09-09 07:00:00      7.0
2018-09-09 07:10:00     28.0
2018-09-09 07:20:00     49.0
2018-09-09 07:30:00    117.0
2018-09-09 07:40:00    310.0
2018-09-09 07:50:00    308.0
Name: 41002, dtype: float64

In [5]: dfMask = dfDif.mask(180 < dfDif)

In [6]: dfMask.head(12)
Out[6]:
0
2018-09-09 06:00:00      NaN
2018-09-09 06:10:00      2.0
2018-09-09 06:20:00      9.0
2018-09-09 06:30:00     15.0
2018-09-09 06:40:00     20.0
2018-09-09 06:50:00     12.0
2018-09-09 07:00:00      7.0
2018-09-09 07:10:00     28.0
2018-09-09 07:20:00     49.0
2018-09-09 07:30:00    117.0
2018-09-09 07:40:00      NaN
2018-09-09 07:50:00      NaN
Name: 41002, dtype: float64

然后我想将这些 NaN 放入原始数据帧 df 中,但我不确定如何执行此操作。我尝试将每个系列(df 和 dfMask)放在同一个数据帧中并尝试比较和替换,但我开始收到警告消息,试图在我想避免的数据帧的切片副本上设置。我将它们保存为自己的变量,但也许我做错了,在创建选择时需要使用 pd.DataFrame?任何帮助,将不胜感激!

标签: pythonpandas

解决方案


这就是我最终做的。我为给定的电台创建了一个新的数据框,然后遍历每个值。

df = pd.DataFrame(WindData[:]['StationNum'])
for k in range(0,len(df)-1):
    if abs(df['41002'][k] - df['41002'][k+1]) >= 180:
        df['41002'][k] = np.nan

推荐阅读