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

8
使用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中打开和解码此文件?
注意:我已经能够使用netcdf4-python打开和解码,但希望能够在xarray中实现这一点,以利用dask提供的外部计算功能。
2个回答

5

这个问题已经在较新版本的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来解决。


3
我曾经遇到过与同一来源和xarray相关的NARR数据类似的问题,但只涉及时间变量。我没有遇到其他变量的问题。
我相信有更简单的方法来解决这个问题(我在python + xarray方面仍然很新),但最终我选择了从感兴趣的数据集中提取时间变量和值,创建一个新的数据集并“解码”时间,然后更新原始数据集中的时间变量和值。请注意,HTML标签已保留。
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数据中的这个问题的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接