将 xarray 列表类型属性写入 netCDF

Writing xarray list-type attributes to netCDF

我希望有一个字符串列表作为 xarray Dataset 中的一个属性,它在序列化到 netCDF 后仍然存在。我相信这可以通过 netCDF-4 中的 NC_STRING type 实现。 xarray 支持这一点,但在写入和读取 netCDF 文件后我无法让它持续存在。往返之后,attr 返回并连接了列表元素。我在想我可能必须设置一个编码参数,虽然我知道如何对变量执行此操作,但我不知道如何对属性执行此操作。

import xarray as xr
ds = xr.Dataset()
ds.attrs['testing'] = ['a', 'b']
print(ds)

给出:

<xarray.Dataset>
Dimensions:  ()
Data variables:
    *empty*
Attributes:
    testing:  ['a', 'b']

现在,

ds.to_netcdf('asdf.nc')
ds = xr.open_dataset('asdf.nc', autoclose=True)
print(ds)

给出:

<xarray.Dataset>
Dimensions:  ()
Data variables:
    *empty*
Attributes:
    testing:  ab

更新

响应@jhamman 的评论,使用 netCDF4 的 netncattr_string 方法支持此行为:

import netCDF4 as nc
rg = nc.Dataset('test_string.nc', 'w', format='NETCDF4')
rg.setncattr_string('testing', ['a', 'b'])
rg.close()

运行 test_string.nc 上的 ncdump 产生:

$ ncdump test_string.nc
netcdf test_string {

// global attributes:
        string :testing = "a", "b" ;
}

与以通常方式设置属性相反,这会导致连接属性,就像上面的 xarray 创建 nc 时一样:

rg = nc.Dataset('test_normal.nc', 'w', format='NETCDF4')
rg.testing = ['a', 'b']
rg.close()

ncdump 结果:

$ ncdump test_normal.nc
netcdf test_normal {

// global attributes:
        :testing = "ab" ;
}

读取使用 setncattr_string 创建的 .nc 文件正确导入字符串列表作为 xarray 数据集中的属性:

ds = xr.open_dataset('test_string.nc')
print(ds)

给出:

<xarray.Dataset>
Dimensions:  ()
Data variables:
    *empty*
Attributes:
    testing:  ['a', 'b']

所以我想像 setncattr_string 这样的东西可以在 xarray 中实现吗?

将字符串列表编码为 xarray 中的属性 has been implemented,应该在下一个版本 (0.10.4) 中。