Доступ к данным по номеру месяца в 3D xarray - PullRequest
0 голосов
/ 10 марта 2020

У меня есть массивы данных (361x361) за январь, февраль, март, апрель, октябрь, ноябрь и де c за определенный год.

До сих пор я хранил их в отдельных файлах netcdf для каждый месяц в году (например, 03.n c, 10.n c)

Я хотел бы объединить все месяцы в один netcdf, чтобы я мог сделать что-то вроде:

march_data = data.sel(month='03') 

или, альтернативно, data.sel(month=3))

До сих пор мне удавалось складывать месячные данные только в массив 361x361x7, и он бесполезно индексируется, так что для получения данных за март вам нужны данные [ :,:, 2] и получить октябрьские данные [:,:, 4]. Очевидно, что 2 и 4 не соответствуют интуитивно мартовским и октябрьским месяцам. Это отчасти потому, что python проиндексирован с нуля, а отчасти потому, что я пропускаю летние месяцы. Я мог бы добавить поля nan в течение пропущенных месяцев, но это не решило бы проблему индекса 0.

Моя попытка до сих пор:

 data = xarray.Dataset( data_vars={'ice_type':(['x','y','time'],year_array),},
                      coords={'lon':(['x','y'],lon_target),
                              'lat':(['x','y'],lat_target),
                              'month_number':(['time'],month_int)})

Здесь year_array - 361x361x7 numpy массив, а month_int - список, который отображает третий индекс year_array на номер месяца: [1,2,3,4,10,11,12].

Когда я пытаюсь получить данные октября с помощью oct = data.sel(month_number=10), он выдает ошибка.

Кстати, я знаю, что здесь возможно найти решение , но, честно говоря, я не понимаю, как оно работает. Моя путаница в основном основана на том, как они используют «время» как в качестве словарного ключа, так и списка времени одновременно.

1 Ответ

0 голосов
/ 20 марта 2020

Я думаю, что я написал вспомогательную функцию, которая делает что-то вроде этого:

def combine_new_ds_dim(ds_dict, new_dim_name):
    """
    Combines a dictionary of datasets along a new dimension using dictionary keys
    as the new coordinates.

    Parameters
    ----------
    ds_dict : dict
        Dictionary of xarray Datasets or dataArrays
    new_dim_name : str
        The name of the newly created dimension

    Returns
    -------
    xarray.Dataset
        Merged Dataset or DataArray

    Raises
    ------
    ValueError
        If the values of the input dictionary were of an unrecognized type
    """

    expanded_dss = []

    for k, v in ds_dict.items():
        expanded_dss.append(v.expand_dims(new_dim_name))
        expanded_dss[-1][new_dim_name] = [k]
    new_ds = xr.concat(expanded_dss, new_dim_name)

    return new_ds

Если у вас есть все данные в отдельных netcdfs, то вы сможете импортировать их в отдельные dataArray S. Предполагая, что вы сделали это, вы могли бы затем сделать

month_das = {
    1: january_da,
    2: february_da,
    ...
    12: december_da
}

year_data = combine_new_ds_dim(month_das, 'month')

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

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