向 xarray 创建的 netCDF 文件添加新维度

Add a new dimension to a netCDF file created by xarray

我有一个很大的Dataset数据集结中心要给它添加一个新的变量idstring一个新的维度idstring_len。 (我不知道他们为什么要把它作为一个新变量,而不是作为一个属性,但是...)

所以我有

import xarray as xr
import numpy as np

ds = xr.Dataset()
ds['time'] = ('time', np.arange(1000))
ds['boo']  = ('time', np.randome.randn(1000))

# File is saved in here, then `open_dataset` to get it again. 

ds['idstr_len'] = ('idstr_len', 50)
ds['idstring'] = ('idstr_len', 'my_helpful_ID_string')

但这给了我 ds['idstr_len'] = ...:

ValueError: dimensions ('idstr_len',) must have the same length as the number of data dimensions, ndim=0

所以我确定有一种向数据集添加维度 post-facto 的好方法,但我不确定它是什么。

编辑:对于更多上下文,他们建议在原始 netcdf 中执行此操作的方式是:

TRAJECTORY_STRING = 'glider-YYYYmmddTHHMM'
trajectory = nc.createDimension('traj_strlen', len(TRAJECTORY_STRING))

trajectory = nc.createVariable('trajectory',
    'S1',
    ('traj_strlen',))

我想我可以在事后使用原始 netcdf 接口完成所有这些操作。

如果您将带有字符串变量的数据集写入 netCDF 文件,xarray 实际上 确实 创建一个虚拟字符串长度维度,例如,考虑:

import xarray
ds = xarray.Dataset({'idstring': 'my_helpful_ID_string'})
ds.to_netcdf('mydata.nc')

ncdump 显示数据具有虚拟维度 string20:

$ ncdump mydata.nc
netcdf mydata {
dimensions:
    string20 = 20 ;
variables:
    char idstring(string20) ;
        idstring:_Encoding = "utf-8" ;
data:

 idstring = "my_helpful_ID_string" ;
}

这是必需的,因为 netCDF 的字符类型仅表示单个字符。

Xarray 无法让您直接控制此维度名称,但您可以事后使用 netCDF4 对其进行修改,例如,

import netCDF4
with netCDF4.Dataset('mydata.nc', 'r+') as nc:
    nc.renameDimension('string20', 'idstring_strlen')