【发布时间】:2018-03-30 20:33:12
【问题描述】:
我希望有一个字符串列表作为 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 中实现来实现这一点?
【问题讨论】:
-
我最初的想法是 netcdf/xarray 并不真正支持这一点。确实没有一种逻辑方法可以将不同字符串的数组存储为属性(在变量上是可行的)。
ncdump -h asdf.nc产生了什么? -
@jhamman:我已经更新了我的问题以解决您的评论。简而言之,我认为可以使用 netCDF4,只是不使用 xarray(还没有?:-)。
-
我认为这值得作为 github 上的 xarray 的功能请求提出。我们也许可以在那里继续对话。
标签: python python-xarray