Обновление attritubtes в xarray на месте - PullRequest
0 голосов
/ 18 октября 2018

Я довольно новичок в использовании xarrays.Я хочу изменить атрибуты файла NetCDF на месте.Но вместо этого встроенная функция дает другой новый набор данных.

ds = xr.open_dataset(file_)
# ds has "time" as one of the coordinates whose attributes I want to modify
#here is ds for more clarity
ds
>><xarray.Dataset>
Dimensions:  (lat: 361, lev: 1, lon: 720, time: 1)
Coordinates:
* lon      (lon) float32 0.0 0.5 1.0 1.5 2.0 ... 357.5 358.0 358.5 359.0 359.5
* lat      (lat) float32 -90.0 -89.5 -89.0 -88.5 -88.0 ... 88.5 89.0 89.5 90.0
* lev      (lev) float32 1.0
* time     (time) timedelta64[ns] 00:00:00
Data variables:
V        (time, lev, lat, lon) float32 ...
Attributes:
Conventions:          CF
constants_file_name:  P20000101_12
institution:          IACETH
lonmin:               0.0
lonmax:               359.5
latmin:               -90.0
latmax:               90.0
levmin:               250.0
levmax:               250.0

Я попытался назначить новый атрибут, но вместо этого он получил новый массив данных

newtimeattr = "some time" 
ds.time.assign_attrs(units=newtimeattr)

В качестве альтернативы, если я назначуэтот атрибут к переменной набора данных "V", вместо этого он добавляет другую переменную в набор данных

ds['V '] = ds.V.assign_attrs(units='m/s')
## here it added another variable V .So, ds has 2 variables with same name as V
ds #trimmed output
>>Data variables:
V        (time, lev, lat, lon) float32 ...
V        (time, lev, lat, lon) float32 ...

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Из документов xarray, xarray.DataArray.assign_attrs

Возвращает новый объект, эквивалентный self.attrs.update (* args, ** kwargs).

Это означает, что этот метод возвращает новый массив данных (или координату) с атрибутами обновления, и вы должны присвоить их набору данных, чтобы они обновили его:

ds.time.assign_attrs(units=newtimeattr)

Как вы указали , это можно сделать, обратившись к атрибутам с использованием синтаксиса ключевого слова:

ds.time.attrs['units'] = newtimeattr

Просто пояснение - причина, по которой ваше последнее утверждение добавляет новыйпеременная потому, что вы присвоили ds.V с обновленными значениями атрибута переменной ds['V '] с пробелом .Начиная с 'V ' != 'V' в python, это создало новую переменную и присвоило ей значения исходного ds.V, после обновления атрибутов.В противном случае ваш метод работал бы нормально:

ds['V'] = ds.V.assign_attrs(units='m/s')
0 голосов
/ 18 октября 2018
ds.V.attrs['units'] = 'm/s'

работал на меня.Аналогично для «времени», которое является измерением

ds.time.attrs['units'] = newtimeattr
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...