在xarray中导入和解码数据集以避免冲突_FillValue和missing_value

时间:2016-02-09 00:22:29

标签: python netcdf python-xarray

当使用xarray open_dataset或open_mfdataset加载NARR netcdf数据集(例如ftp://ftp.cdc.noaa.gov/Datasets/NARR/monolevel/air.2m.2010.nc)时,xarray会返回有关“冲突的_FillValue和missing_values”的错误。

输入:

ds = xarray.open_dataset('air.2m.2010.nc')

产生此错误:

ValueError: ('Discovered conflicting _FillValue and missing_value. Considering opening the offending dataset using decode_cf=False, corrected the attributes', 'and decoding explicitly using xray.conventions.decode_cf(ds)')

当使用建议打开时:

ds = xarray.open_dataset('air.2m.2010.nc',decode_cf=False)

打开数据集,但不解码变量,时间,坐标等(显然)。显式地使用xarray.decode_cf(ds)似乎没有帮助成功解码数据集,因为遇到了相同的错误。

我相信这个错误的产生是因为NARR数据集是一个Lambert Conformal,所以由于xarray打开时网格的形状存在一些缺失值,并且由于某种原因,这与填充值冲突。

在xarray中打开和解码此文件的最佳方法是什么?

N.B。我已经能够使用netcdf4-python打开和解码,但是希望能够在xarray中执行此操作以利用它来自dask提供的核心计算功能。

2 个答案:

答案 0 :(得分:3)

此问题已在xarray的最新版本中得到解决。使用0.12版,我得到以下信息

>>> ds = xr.open_dataset('air.2m.2010.nc')
.../conventions.py:394: SerializationWarning: variable 'air' has multiple fill values {9.96921e+36, -9.96921e+36}, decoding all values to NaN.

换句话说,它会发出警告,而不是错误,并成功地将掩码应用于两个缺失值。

因此,可以通过升级到最新版本的xarray来解决您的问题。

答案 1 :(得分:2)

我能够解决与来自相同源和xarray的NARR数据类似的问题,但仅针对时间变量。我没有其他变量的问题。

我确信有更简单的方法可以做到这一点(我仍然是python + xarray的新手),但我最终从我感兴趣的数据集中获取时间变量和值,创建了一个新的数据集和'解码'时间,然后更新我感兴趣的原始数据集中的时间变量和值。

test = xr.open_mfdataset(r'evap*nc',decode_cf=False)

t_unit = test.variables['time'] 
t_unit.attrs['units']
#u'hours since 1800-1-1 00:00:0.0'

attrs = {'units': 'hours since 1800-01-01'}
ds = xr.Dataset({'time': ('time', t_unit, attrs)})
ds = xr.decode_cf(ds)

test.update({'time':('time', ds['time'])})

如果您找到更简单的方法,请告诉我!我目前在其他来源使用的研究数据集中没有这个问题,但是对其他人如何使用ESRL NARR数据解决这个问题感到好奇。