С помощью xarray.Dataset.to_zarr можно записать xarray в файл .zarr и добавить новые данные по размеру с помощью параметра append_dim. Однако если координаты новых данных для этого ...

1
SyntaxError 17 Дек 2020 в 14:29

1 ответ

Лучший ответ

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

Однако в версии 0.16.2 файла xarray введено ключевое слово region для to_zarr, которое позволяет вам писать в ограниченную область файла zarr.

Вы можете использовать его для перезаписи существующих данных:

# write first dataset
ds_A.to_zarr("weather.zarr")

# read structure of dataset to see what's on disk
ds_ondisk = xr.open_zarr('weather.zarr/')

# get index of first new datapoint
start_ix, = np.nonzero(~np.isin(ds_B.space, ds_ondisk.space))

# region of new data
region_new = slice(start_ix[0], ds_B.space.size)

# append structure of new data (compute=False means no data is written)
ds_B.isel(space=region_new).to_zarr("weather.zarr", append_dim='space', compute=False)

# get updated dataset size and create slice
ds_ondisk = xr.open_zarr('weather.zarr/')
region_update = slice(start_ix[0], ds_ondisk.space.size)

# write new data to zarr (time needs to be dropped)
ds_B.drop("time").to_zarr("weather.zarr", region={"space": region_update})

# produces
xr.open_zarr('weather.zarr/')

<xarray.Dataset>
Dimensions:       (space: 3, time: 4)
Coordinates:
  * space         (space) <U2 'IA' 'IL' 'NY'
  * time          (time) datetime64[ns] 2000-01-01 2000-01-02 ... 2000-01-04
Data variables:
    measurements  (time, space) float64 dask.array<chunksize=(4, 2), meta=np.ndarray>

1
Val 20 Дек 2020 в 13:44