如何从xarray中移除和识别密钥以写入netcdf文件



我想将我的xarray写入一个netcdf文件。我已经从一个netcdf文件中派生了它,我通过使用一个形状文件屏蔽了它。它看起来是这样的:

<xarray.Dataset>
Dimensions:              (DATE: 14245, x: 214, y: 173)
Coordinates:
* DATE                 (DATE) datetime64[ns] 1980-01-01T12:00:00 ... 2018-1...
* x                    (x) float64 6.168e+05 6.171e+05 ... 6.698e+05 6.701e+05
* y                    (y) float64 5.113e+06 5.113e+06 ... 5.156e+06 5.156e+06
transverse_mercator  int64 0
Data variables:
precipitation        (DATE, y, x) float32 nan nan nan nan ... nan nan nan
Attributes:
CDI:          Climate Data Interface version 1.9.9 (https://mpimet.mpg.de...
Conventions:  CF-1.5
Title:        Daily total precipitation Trentino-South Tyrol 250-meter re...
Created on:   Fri Feb 26 21:30:51 2021
history:      Fri Feb 26 23:31:30 2021: cdo -z zip -mergetime DAILYPCP_19...
CDO:          Climate Data Operators version 1.9.9 (https://mpimet.mpg.de...

如果我试着把它写成:

ds_subset.to_netcdf('test.nc')

然而,我得到以下错误:

ValueError: failed to prevent overwriting existing key grid_mapping in attrs. This is probably an encoding field used by xarray to describe how a variable is serialized. To proceed, remove this key from the variable's attributes manually.

由于我无法在我有问题的地方找到密钥,我试图将其保存为xarray:

xr.save_mfdataset(ds_subset, 'test.xr')

但我得到以下错误:

ValueError: cannot use mode='w' when writing multiple datasets to the same path

我更喜欢第一种解决方案。我有两件事要指出:I(我觉得问题是由于原始文件是一个数据集;ii(原始netcdf文件似乎有一些缺失的字段,我用rioxarray 填充了这些字段

然而,我无法找出问题出在哪里

谢谢你的任何帮助。

我希望这里还有一些有用的信息:这是的结果

ds_subset.precipitation.attrs["grid_mapping"]
Out[3]: 'transverse_mercator'

ds_subset.encoding
Out[4]: {}

ds_subset.precipitation.encoding
Out[5]: 
{'zlib': True,
'szip': False,
'zstd': False,
'bzip2': False,
'blosc': False,
'shuffle': True,
'complevel': 1,
'fletcher32': False,
'contiguous': False,
'chunksizes': (1, 643, 641),
'source': 'read file path',
'original_shape': (14245, 643, 641),
'dtype': dtype('float32'),
'missing_value': -999.0,
'_FillValue': -999.0,
'grid_mapping': 'transverse_mercator'}
关于您的第二个问题。此语法仅适用于数据集和名称的迭代。您必须将xr.save_mfdataset([ds_subset], ['test.nc'])指定为save_mfdataset用于多个数据集,从而利用dask实现同时写入操作。也就是说,如果只传递一个数据集(和名称(,那么还不如使用to_netcdf

使用这个xr.save_mfdataset([ds_subset], ['test.nc']),你可能会得到与你的第一个问题(上面已经回答了(相同的错误。

最新更新