编辑现有的NetCDF / 将NetCDF写入相同名称。

4

我想编辑netcdf数据集并将它们保存回相同的文件名(例如:更改数据集中的属性或变量名称)。例如:

import xarray as xr
import numpy as np

data = xr.DataArray(np.random.randn(2, 3), coords={'x': ['a', 'b']}, dims=('x', 'y'))
data.to_netcdf('test.nc')

test_open=xr.open_dataset('test.nc')
test_open=test_open.rename({'__xarray_dataarray_variable__':'var'})
test_open.to_netcdf('test.nc')

这会导致一个'权限被拒绝'的错误 "PermissionError: [Errno 13] Permission denied"

阅读https://github.com/pydata/xarray/issues/2887,看起来是因为文件已经被打开,我也尝试过:

with xr.open_dataset('test.nc') as test_open:
    test_open=test_open.rename({'__xarray_dataarray_variable__':'var'})
    test_open.to_netcdf('test.nc')

或者

with xr.open_dataset('test.nc') as test_open:
    test_open=test_open.rename({'__xarray_dataarray_variable__':'var'})
test_open.to_netcdf('test.nc')

我经常需要处理大型数据集,因此不想将数据集加载到内存中,即使我这样做,有时也会出现“HDF5”错误。 我不完全理解这里的问题是什么,有人可以解释一下吗?似乎必须更改数据集的元数据而无需加载或重命名数据集是一个常见问题。我正在使用最新版本的xarray,0.16.1。

你不能使用xarray来完成这项任务。我认为你可以使用netCDF库实现 - 不过我不能完全确认。Xarray真正重要的是计算,对于对netCDF编码文件的原地操作提供的支持很少。 - Michael Delgado
请参见例如 https://stackoverflow.com/a/61638623/3888719。 - Michael Delgado
好的,谢谢您的建议,我会尝试使用netCDF。我以为xarray使用netCDF,所以认为它们在读写方面有类似的功能。 - user12938030
即使需要加载数据集,是否有一种方法可以使用xarray读取数据集“文件名”,对其进行某些操作并将其写入相同的名称?这似乎在我的某些文件上有效,但在其他文件上无效,也许有人有一种一致的方法可以在所有文件上运行? - user12938030
@MichaelDelgado,虽然直接使用netCDF库可能没问题,但打开和关闭文件以及正确处理文件指针似乎对我来说是非常基础的东西,那么为什么一个功能齐全的库,比如xarray,不能胜任呢? - FObersteiner
2
如果您认为在原地修改netCDF属性是其中一个功能,那么xarray就不是“完全功能”的 :) 这是用户长期以来的请求,核心团队似乎对支持它不感兴趣。我同意他们的决定 - 这是一个特定于数据格式的请求,由python-netCDF4和其他客户端库很好地处理,并且不适合xarray使用的惰性加载计算模型。 - Michael Delgado
1个回答

2

来源:https://xarray.pydata.org/en/stable/user-guide/io.html

使用 mode='a' 参数可以追加或覆盖 netCDF 变量。使用此选项时,所有数据集中的变量都将写入原始 netCDF 文件,无论它们是否存在于原始数据集中。

在我使用的 python NetCDF 库中:

netCDF4.Dataset(file,'r+',clobber=True)

可用于就地编辑属性和变量。也许可以将 clobber 传递给 xarray 的 **kwargs,这些参数将传递给底层的 NetCDF4 引擎。


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