python - 在行之间的差异大于一定数量的地方放置 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?任何帮助,将不胜感激!
解决方案
这就是我最终做的。我为给定的电台创建了一个新的数据框,然后遍历每个值。
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
推荐阅读
- reactjs - Antd 选择句柄函数类型打字稿
- angular - Angular:在没有数据库的情况下存储长文本
- c - C-算术和优先级
- javascript - 旋转的图像无法在 Google Chrome 浏览器中正确显示
- css - how to force change the primary button text color bootstrap 4 by scss
- c++ - 删除宏扩展的尾随逗号
- php - How to Replace Global Variable for MySQL Connection
- abap - CL_GUI_HTML_VIEWER 获取html源页面
- interface - Python3.8 类型协议:适配器注册表有什么标准吗?
- r - 如果 R 中 data.frame 的一列中存在两个指定值,如何保留一组的所有行