Добавить новое измерение в файл netCDF, созданный xarray - PullRequest
1 голос
/ 02 апреля 2019

У меня есть большое 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

Так что я уверен, что есть хороший способ добавить измерение постфактум в набор данных, но я не уверен, что это такое.

РЕДАКТИРОВАТЬ: Для большего контекста, они предлагают сделать это в raw netcdf:

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

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

Полагаю, я мог бы просто сделать все это с помощью интерфейса raw netcdf после свершившегося факта.

1 Ответ

0 голосов
/ 03 апреля 2019

Если вы записываете набор данных со строковой переменной в файл 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')
...