XArray: добавить «слой» данных в NetCDF - PullRequest
3 голосов
/ 28 марта 2019

Настройка

предположим, у меня есть файл NetCDF, в котором хранится несколько растров, проиндексированных date, longitudes и latitudes, загруженных в память с XArray с именем "stack":

<xarray.Dataset>
Dimensions:   (date: 1, lat: 2000, lon: 7200)
Coordinates:
  * date      (date) datetime64[ns] 2000-01-01
  * lat       (lat) float64 49.97 49.92 49.87 49.82 ... -49.88 -49.93 -49.98
  * lon       (lon) float64 -180.0 -179.9 -179.9 -179.8 ... 179.9 179.9 180.0
Data variables:
    rainfall  (date, lat, lon) float64 ...

Задача

чтобы добавить новый date в стек.

способ

Мой подход заключается в создании Dataset "нового" из растра с теми же индексами, что и у загруженного NetCDF:

xr.DataArray(
     <some numpy data>,
     dims=['date', 'lat', 'lon'],
     coords={
         'date': [<some datetime64>],
         'lat': <same list of latitudes>,
         'lon': <same list of longitudes>
     },
     name='rainfall'
).to_dataset()

и затем объединить:

merged = xr.concat([stack, new], dim='date')

Это работает, но не очень элегантно и, будучи новичком в XArray, может быть, есть лучший способ сделать это, например, просто с помощью некоторых подпрограмм индексирования, например, добавить новые date и данные; что-то вроде:

stack[<new_date>] = <some numpy data>

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

После некоторой работы у меня есть обходной путь с использованием netCDF4-python, который полезен, если вы ищете способ не загружать весь netCDF в память сразу.

Исходный файл netCDF обрабатывается с XArray, но я возвращаюсь к netCDF4 для этой конкретной операции.

Ниже приведен пример, где я хочу добавить временной шаг к неограниченному переменная date.Другие 2 переменные: долготы и широты .

Сначала я открываю netCDF с помощью netCDF4 и читаю переменные date, которые я расширю, а также data

d = Dataset('dataset.nc', 'a')
dt = d.variables['date']
data = d.variables['data']

, после чего я добавляю массив numpy вломтик:

data[len(dt):len(dt)+1, :,:] = <some numpy data>

и, наконец, добавьте дополнительный временной шаг:

from datetime import datetime
from netCDF4 import date2num
dt[len(dt)-1] = date2num(datetime(<year>, <month>, <day>), dt.units)

Надеюсь, что это будет полезно для других.

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

Попробуйте использовать reindex для расширения исходного массива данных, а затем назначить значение с индексированием .

extra_date = <some datetime64>
date_extended = np.concatenate([stack.date, [extra_date]]
# this will extend the arrays and place NaNs in the new position
stack_extended = stack.reindex({'date': date_extended})
# now assign to that position
stack_extended.loc[dict(date=extra_data)] = <some numpy data>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...