用Python将现有netcdf文件中的NAN替换为-9999

用Python将现有netcdf文件中的NAN替换为-9999,python,nan,netcdf,Python,Nan,Netcdf,我有一个netcdf文件,其中一个变量包含nan。我想读取文件,然后用-9999替换NAN。然后保存新netcdf文件的更改。到目前为止,我有: import netCDF4 as nc from netCDF4 import Dataset import numpy as np f = Dataset('anen_12km_1yr_san_angelo_00Z_100m_38_small_2014.nc','r+') f.variables['wspd_wrf_m'][:][f.variab

我有一个netcdf文件,其中一个变量包含nan。我想读取文件,然后用-9999替换NAN。然后保存新netcdf文件的更改。到目前为止,我有:

import netCDF4 as nc
from netCDF4 import Dataset
import numpy as np

f = Dataset('anen_12km_1yr_san_angelo_00Z_100m_38_small_2014.nc','r+')
f.variables['wspd_wrf_m'][:][f.variables['wspd_wrf_m'][:] == np.nan] = -9999.
f.close() 
当我重新打开这个文件并打印出这个变量的np.max或np.min时,我仍然得到nan而不是-9999。我需要做什么来替换此netcdf文件中的nan并用替换的nan的更改重写新的netcdf文件?

您不能使用==np.nan比较。考虑这个例子:

arr = np.random.random(3)
arr[1] = np.nan
print(arr)
print(arr == np.nan)
这使得:

阵列[0.88978822,nan,0.71066851]

[假]

检查NAN的正确方法是使用np.isnan:

返回:

[假-真-假]

您可以使用它来替换NAN,类似于您现在所做的:

arr[np.isnan(arr)] = -9999
不能使用==np.nan比较。考虑这个例子:

arr = np.random.random(3)
arr[1] = np.nan
print(arr)
print(arr == np.nan)
这使得:

阵列[0.88978822,nan,0.71066851]

[假]

检查NAN的正确方法是使用np.isnan:

返回:

[假-真-假]

您可以使用它来替换NAN,类似于您现在所做的:

arr[np.isnan(arr)] = -9999

除了在python中执行此操作之外,还可以使用CDO在命令行的一行中执行此操作:

cdo setmissval,-9999 in.nc out.nc

这会将所有缺少的值更改为-9999,并在file out.nc中将_FillValue元数据设置为-9999。作为在python中执行此操作的替代方法,您也可以使用CDO在命令行的一行中执行此操作:

cdo setmissval,-9999 in.nc out.nc

这会将所有缺少的值更改为-9999,并在文件输出中将_FillValue元数据设置为-9999。nc

我是否可以询问您是否仍希望在netcdf _FillValue元数据中将-9999识别为缺少?i、 e.像ncview这样的软件会将-9999视为在修订后的文件中丢失?我可以问一下,您是否希望在netcdf\u FillValue元数据中仍然将-9999视为丢失?i、 e.像ncview这样的软件会将-9999视为修改后的文件中缺少的?是的,我用-9999替换了nan,因为这将是我对netcdf文件缺少的填充值。当OP询问如何使用语言Y执行任务X时,一些人认为应该只提供语言Y的答案,这就是为什么。我个人认为,为task X提供其他解决方案可能会很有用,或者对其他不热衷于特定方法的人来说,答案毕竟是公开发布的,或者OP不知道存在简单的命令行选项来解决任务。我的意见:-是的,我用-9999替换了nan,因为这将是我的netcdf文件丢失的填充值。当OP询问如何使用语言Y执行任务X时,一些人认为应该只提供语言Y的答案,这就是为什么。我个人认为,为task X提供其他解决方案可能会很有用,或者对其他不热衷于特定方法的人来说,答案毕竟是公开发布的,或者OP不知道存在简单的命令行选项来解决任务。意见问题我想:-