xarray 自动将 _FillValue 应用于 netCDF 输出上的坐标
xarray automatically applying _FillValue to coordinates on netCDF output
我正在尝试创建一个 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)
或通过更改数据类型,但我没有任何运气。我不希望使用 netCDF4 重新加载文件以删除 _FillValues。有没有内置于 xarray 中的解决方法?
更新 2022:在较新版本的 xarray 中,'_FillValue': False
应替换为 '_FillValue': None
。感谢@Biggsy 在下面的评论中指出这一点。
将 _FillValue: False
添加到 lat/lon 编码似乎有效:
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" ;
}
我正在尝试创建一个 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)
或通过更改数据类型,但我没有任何运气。我不希望使用 netCDF4 重新加载文件以删除 _FillValues。有没有内置于 xarray 中的解决方法?
更新 2022:在较新版本的 xarray 中,'_FillValue': False
应替换为 '_FillValue': None
。感谢@Biggsy 在下面的评论中指出这一点。
将 _FillValue: False
添加到 lat/lon 编码似乎有效:
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" ;
}