xarray 自动将 _FillValue 应用于 netCDF 输出上的坐标

Posted

技术标签:

【中文标题】xarray 自动将 _FillValue 应用于 netCDF 输出上的坐标【英文标题】:xarray automatically applying _FillValue to coordinates on netCDF output 【发布时间】:2018-01-23 10:10:17 【问题描述】:

我正在尝试创建一个符合 cf 的 netcdf 文件。我可以得到它大约 98% cf 与 xarray 兼容,但我遇到了一个问题。当我对正在创建的文件执行 ncdump 时,我看到以下内容:

float lon(lon) ;
    lon:_FillValue = NaNf ;
    lon:long_name = "Longitude" ;
    lon:standard_name = "longitude" ;
    lon:short_name = "lon" ;
    lon:units = "degrees_east" ;
    lon:axis = "X" ;
    lon:valid_min = -180.f ;
    lon:valid_max = 180.f ;
float lat(lat) ;
    lat:_FillValue = NaNf ;
    lat:long_name = "Latitude" ;
    lat:standard_name = "latitude" ;
    lat:short_name = "lat" ;
    lat:units = "degrees_north" ;
    lat:axis = "Y" ;
    lat:valid_min = -90.f ;
    lat:valid_max = 90.f ;
double time(time) ;
    time:_FillValue = NaN ;
    time:standard_name = "time" ;
    time:units = "days since 2006-01-01" ;
    time:calendar = "gregorian" ;

我的数据集的坐标是纬度、经度和时间。当我通过 ds.to_netcdf() 转换为 netcdf 时,所有坐标变量都会自动应用填充值,因为它们是浮点数。应用了填充值的坐标变量违反了 cf 标准 (http://cfconventions.org/cf-conventions/v1.6.0/cf-conventions.html#attribute-appendix)。

我尝试更改编码,以便不压缩这些特定变量:

import numpy as np
import xarray as xr
import pandas as pd
import datetime as dt

lons = np.arange(-75, -70, .5).astype(np.float32)
lats = np.arange(40,42, .25).astype(np.float32)
[x, y] = np.meshgrid(lons, lats)
u = np.random.randn(1, 8, 10).astype(np.float32)
v = np.random.randn(1, 8, 10).astype(np.float32)
time_index = pd.date_range(dt.datetime.now(), periods=1)

ds = xr.Dataset()
coords = ('time', 'lat', 'lon')
ds['u'] = (coords, np.float32(u))
ds['v'] = (coords, np.float32(v))
ds.coords['lon'] = lons
ds.coords['lat'] = lats
ds.coords['time'] = time_index

encoding = 'lat': 'zlib': False,
            'lon': 'zlib': False,
            'u': '_FillValue': -999.0,
                  'chunksizes': (1, 8, 10),
                  'complevel': 1,
                  'zlib': True
            
ds.to_netcdf('test.nc', encoding=encoding)

或通过更改 dtypes,但我没有任何运气。我不希望使用 netCDF4 重新加载文件以删除 _FillValues。有没有内置在 xarray 中的解决方法?

【问题讨论】:

有趣的问题,但一如既往,提供minimal working example 可以让其他人更容易调查这个问题。 道歉。我添加了一个测试示例。 【参考方案1】:

_FillValue: False 添加到纬度/经度编码似乎有效:

encoding = 'lat': 'zlib': False, '_FillValue': False,
            'lon': 'zlib': False, '_FillValue': False,
            'u': '_FillValue': -999.0,
                  'chunksizes': (1, 8, 10),
                  'complevel': 1,
                  'zlib': True
            

结果文件的ncdump -h

netcdf test 
dimensions:
    time = 1 ;
    lat = 8 ;
    lon = 10 ;
variables:
    float u(time, lat, lon) ;
        u:_FillValue = -999.f ;
    float v(time, lat, lon) ;
        v:_FillValue = NaNf ;
    float lon(lon) ;
    float lat(lat) ;
    int64 time(time) ;
        string time:units = "days since 2017-08-15 17:41:19.460662" ;
        string time:calendar = "proleptic_gregorian" ;

【讨论】:

噢!事情总是那么简单。这行得通。我之前尝试过 _FillValue=None 并且由于某种原因,我没有想到使用 False!非常感谢! 我找不到这方面的文档,所以这也只是我的猜测。 False 是在 None 之后的第二次尝试...如果解决方案有效,您可以接受答案以获得未决问题列表。

以上是关于xarray 自动将 _FillValue 应用于 netCDF 输出上的坐标的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义函数应用于 xarray.Dataset 坐标的每个值?

fillvalue填充的位置是空白值吗

将 70 个 netCDF 文件与 xarray 合并

xarray - 返回满足特定条件的数据,而不必使用for循环

关于mybatis plus 中 MetaObjectHandler 自动填充功能出现的问题及处理

数据可视化应用xarray 绘图可视化-创建xarray对象&数据读取和转换&数据索引和分片&插值和广播(附代码)