首页 > 解决方案 > 向 xarray 创建的 netCDF 文件添加新维度

问题描述

我有一个很大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

所以我确信有一种很好的方法可以将维度事后添加到数据集,但我不确定它是什么。

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

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

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

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

标签: python-xarray

解决方案


如果您将带有字符串变量的数据集写入 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')

推荐阅读