将 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) 中。
我希望有一个字符串列表作为 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) 中。