xarray создает новый набор данных с той же широтой / долготой, что и другой файл - PullRequest
0 голосов
/ 06 ноября 2018

Я работаю с моделью поверхности суши, которую хочу протестировать с некоторыми фиктивными данными. Существует один набор данных, который читается без ошибок. Это данные почвы ниже:

<xarray.Dataset>
Dimensions:    (time: 1, x: 200, y: 200)
Coordinates:
  * time       (time) float64 1.051e+04
Dimensions without coordinates: x, y
Data variables:
    t_clay     (time, y, x) float32 ...
    t_sand     (time, y, x) float32 ...
    t_silt     (time, y, x) float32 ...
    t_sum      (time, y, x) float32 ...
    s_clay     (time, y, x) float32 ...
    s_sand     (time, y, x) float32 ...
    s_silt     (time, y, x) float32 ...
    s_sum      (time, y, x) float32 ...
    latitude   (y, x) float64 40.0 40.0 40.0 40.0 40.0 ... 50.0 50.0 50.0 50.0
    longitude  (y, x) float64 0.0 0.0656 0.1312 0.1968 ... 15.4 15.48 15.56
Attributes:
    Conventions:     CF-1.0
    content:         HARMONIZED WORLD SOIL DATABASE; first it was aggregated ...
    scaling_factor:  20

Я хочу использовать одну и ту же latitude / longitude сетку из этого xr.Dataset в других моих переменных.

Например, данные излучения (случайно сгенерированные значения) выглядят следующим образом:

<xarray.Dataset>
Dimensions:    (latitude: 600, longitude: 600)
Coordinates:
    time       datetime64[ns] 2000-02-14
  * longitude  (longitude) float32 26.024994 26.074997 ... 55.924988 55.97499
  * latitude   (latitude) float32 17.974998 17.924995 ... -11.925003 -11.974998
Data variables:
    Rg         (latitude, longitude) float32 1.09 1.0 0.28 ... 0.51 0.13 0.07

1. Мне нужно создать новый xr.Dataset с той же формой, что и данные почвы выше.

2. Мне также нужно, чтобы longitude & latitude Coordinates был сохранен как Data variables.

У Fortran возникают проблемы с чтением «долготы», когда он хранится как Coordinate, а не Variable

Спасибо!

1 Ответ

0 голосов
/ 06 ноября 2018

Итак, мне удалось создать образцы из данных в другом объекте xr.Dataset, используя следующий код:

1. Импортные пакеты

import numpy as np
import xarray as xr
from shutil import copyfile
import os

np.random.seed(123)

2. инициализировать «скелет» из данных почвы

s = xr.open_dataset(s_dir)

# drop all but ONE variable!
s = s.drop(["t_clay","t_silt","t_sum", "t_sand", "s_clay", "s_sand", "s_silt"])

# can extend this list to include a number of variables
variables = ["Rg"]

3. Зацикливание каждой переменной, случайное получение значений из интересующей переменной (Rg) и вставка в скелет, предоставленный старым xr.Dataset.

for var in l:
    filename = data_dir + "{}_dummy.nc".format(var)
    print("** Creating file: ", filename, " **")

    # copy file and open the new temp file
    copyfile(filename, data_dir + "temp.nc")
    ds = xr.open_dataset(data_dir + "temp.nc")

    # generate randomly from variable in another xarray object
    s.s_sum.values = np.random.choice(
        ds[var].values.flatten(), size=s.s_sum.values.shape
    )
    ds = s.copy()
    ds = ds.rename({"s_sum": var})

    ds.to_netcdf(filename, format="NETCDF3_CLASSIC")
    print("File Created!")

    # remove temporary file
    os.remove(data_dir + "temp.nc")
    print("Temporary Data Removed")

    del ds

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...