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

时间:2019-04-02 16:25:40

标签: python-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

因此,我确定有一个很好的方法可以在数据集后添加维度,但是我不确定它是什么。

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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