在编写to_netcdf时,在Xarray数据集中为许多变量指定编码/压缩



我一直在写一些具有多个变量的xarray.dataset。目前,为了保持尺寸可管理,我指定编码,例如Zlib,但需要按变量(DataArray)在可变的基础上应用。

将相同的编码参数应用于所有变量的好方法是什么?例如

<xarray.Dataset>
Dimensions:  (lat: 1440, lon: 2880)
Coordinates:
  * lat      (lat) float64 -90.0 -89.88 -89.75 -89.62 -89.5 -89.38 -89.25 ...
  * lon      (lon) float64 -180.0 -179.9 -179.8 -179.6 -179.5 -179.4 -179.2 ...
Data variables:
a1     (lat, lon) float64 nan nan nan nan nan nan nan nan 0.0 ...
b     (lat, lon) float64 nan nan nan nan nan nan 0.0 0.0 0.0 ...
c     (lat, lon) float64 nan nan nan nan nan nan nan nan 0.0 ...
d      (lat, lon) float64 nan nan nan nan nan nan nan nan 0.0 ...
e      (lat, lon) float64 nan nan nan nan nan nan nan nan 0.0 ...

写出此数据集时,我们将使用:

ds.to_netcdf(filename, encoding={'a1':{'zlib': True,'complevel': 5},'b':{'zlib': True,'complevel': 5},'c':{'zlib': True,'complevel': 5},'d':{'zlib': True,'complevel': 5},'e':{'zlib': True,'complevel': 5}})

对于更多变量,这很长。一个选项是按顺序的附加基础将每个数据隔间写入NetCDF,但是当数据集准备好使用时,这似乎也令人费解。

我只是动态创建编码参数:

comp = dict(zlib=True, complevel=5)
encoding = {var: comp for var in ds.data_vars}
ds.to_netcdf(filename, encoding=encoding)

,或者您可以在数据集中存储每个变量的编码信息:

comp = dict(zlib=True, complevel=5)
for var in ds.data_vars: 
    var.encoding.update(comp)
ds.to_netcdf(filename)

https://github.com/pydata/xarray/discussions/5709

这个答案导致_FillValue失踪了:https://stackoverflow.com/a/40818232

这个答案提出了'runtimeerror:netcdf:无效参数':https://stackoverflow.com/a/66333685

但是,这有效:

encoding = {}
encoding_keys = ("_FillValue", "dtype", "scale_factor", "add_offset", "grid_mapping")
for data_var in ds.data_vars:
    encoding[data_var] = {key: value for key, value in ds[data_var].encoding.items() if key in encoding_keys}
    encoding[data_var].update(zlib=True, complevel=5)
ds.to_netcdf(filename, encoding=encoding)

所选解决方案覆盖所有编码。大概是使用xr.open_mfdataset()打开数据集。这将从第一个文件中获取编码。我在ERA5数据中看到的是,当用int dtype(这是ERA5数据集的DTYPE)写入文件时,scale_factor不适用于其他ERE5文件。解决方案是删除dtype属性(删除scale_factor似乎也有效,但降低了精度)。如果用dict(zlib=True, complevel=5)覆盖编码,则dtypescale_factor属性都消失了,因此它解决了问题,但不是因为正确的原因。

相关内容

最新更新