Как объединить данные из нескольких файлов netCDF с xarray в Python? - PullRequest
5 голосов
/ 01 апреля 2019

Я пытаюсь открыть несколько файлов netCDF с помощью xarray в Python.Файлы имеют данные одинаковой формы, и я хочу объединить их, создав новое измерение.

Я попытался использовать аргумент concat_dim для xarray.open_mfdataset (), но он не работает должным образом.Ниже приведен пример, который открывает два файла с данными о температуре для 124 раз, 241 широты и 480 долгот:

DS = xr.open_mfdataset( 'eraINTERIM_t2m_*.nc', concat_dim='cases' )
da_t2m = DS.t2m

print( da_t2m )

С этим кодом я ожидаю, что массив данных результата будет иметь форму, похожую на (случаи: 2, время: 124, широта: 241, долгота: 480).Тем не менее, его форма была (случаи: 2, время: 248, широта: 241, долгота: 480).Он создает новое измерение, но также суммирует крайнее левое измерение: измерение «время» двух наборов данных.Мне было интересно, является ли это ошибкой из 'xarray.open_mfdateset' или это ожидаемое поведение, потому что измерение 'time' НЕОГРАНИЧЕНО для обоих наборов данных.

Есть ли способ объединить данные из этих файлов напрямую с помощью xarray и получитьвыше ожидаемый доход?

Спасибо.

Матеус

Ответы [ 3 ]

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

Исходя из моего комментария, я бы попробовал это:

def preproc(ds):
    ds = ds.assign({'stime': (['time'], ds.time)}).drop('time').rename({'time': 'ntime'})
    # we might need to tweak this a bit further, depending on the actual data layout
    return ds

DS = xr.open_mfdataset( 'eraINTERIM_t2m_*.nc', concat_dim='cases', preprocess=preproc)

Хорошо, что вы сохраняете исходную координату времени в stime при переименовании исходного измерения (time -> ntime).

Если все работает хорошо, вы должны получить результирующие размеры как (cases, ntime, latitude, longitude).

Отказ от ответственности: Я делаю аналогичнов цикле с конечным concat (который работает очень хорошо), но не проверял preprocess -подход.

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

Результат имеет смысл, если времена разные.

Чтобы упростить его, на мгновение забудем о латентном измерении и представим, что у вас есть два файла, которые являются просто данными в 2 временных интервалах.Первый содержит данные с временными шагами 1,2, а второй - с временными шагами 3 и 4. Вы не можете создать комбинированный набор данных с измерением времени, который охватывает только 2 временных интервала;переменная измерения времени должна иметь времена 1,2,3,4.Поэтому, если вы говорите, что хотите новое измерение "case", тогда данные объединяются в 2d-массив и выглядят так:

times: 1,2,3,4

cases: 1,2

data: 
               time
          1    2    3    4
cases 1:  x1   x2 
      2:            x3   x4

Подумайте о файле netcdf, который был бы эквивалентен,измерение времени должно охватывать диапазон значений, присутствующих в обоих файлах.Единственный способ объединить два файла и получить их (случаи: 2, время: 124, широта: 241, долгота: 480), если оба файла имеют одинаковые значения времени, широты и долготы, т.е. указывают на одну и ту же область вtime-lat-lon space.

ps: Немного не по теме вопроса, но если вы только начинаете новый анализ, почему бы не переключиться на новое поколение, повторный анализ ERA-5 с более высоким разрешением, которыйтеперь доступна и в 1979 году (и в дальнейшем будет расширена), вы можете скачать ее прямо на рабочий стол с помощью скриптов Python API здесь:

https://cds.climate.copernicus.eu/cdsapp#!/search?type=dataset

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

Спасибо @AdrianTompkins и @jhamman.После ваших комментариев я понимаю, что из-за разных периодов времени я действительно не могу получить то, что хочу, с xarray.

Моя главная цель создать такой массив - собрать в одном массиве ND все данные для разных событий,с той же продолжительностью времени.Таким образом, я могу легко получить, например, составные поля всех событий для каждого времени (час, день и т. Д.).

Я пытаюсь сделать то же самое, что и с NCL.Ниже приведен код для NCL, который работает, как и ожидалось (для меня) для тех же данных:

f = addfiles( (/"eraINTERIM_t2m_201812.nc", "eraINTERIM_t2m_201901.nc"/), "r" )
ListSetType( f, "join" )
temp = f[:]->t2m
printVarSummary( temp )

Окончательный результат - массив с 4 измерениями, новый из которых автоматически называется ncl_join .

Однако NCL не учитывает временную ось, присоединяет массивы и дает результирующей временной оси координаты первого файла.Таким образом, ось времени становится бесполезной.

Однако, как уже говорилось для @AdrianTompkins, периоды времени разные, и xarray не может присоединяться к таким данным.Итак, для создания такого массива в Python с xarray, я думаю, единственный способ - удалить временную координату из массивов.Таким образом, измерение времени будет иметь только целочисленные индексы.

Массив, заданный xarray, работает так, как @AdrianThompkins сказал в своем небольшом примере.Поскольку он сохраняет временные координаты для всех объединенных данных, я думаю, что решение xarray является правильным по сравнению с NCL.Но теперь я думаю, что вычисление композитов (получая тот же пример, приведенный выше) не будет выполнено так просто, как кажется с NCL.

В небольшом тесте я печатаю два значения из объединенного массива с помощью xarrayс

print( da_t2m[ 0, 0, 0, 0 ].values )
print( da_t2m[ 1, 0, 0, 0 ].values )

Что приводит к

252.11412
nan

Во втором случае нет данных для первого раза, как ожидалось.

ОБНОВЛЕНИЕ: все ответы помогают мне лучше понять эту проблему, поэтому мне пришлось добавить здесь обновление, чтобы также поблагодарить @kmuehlbauer за его ответ, указывающий, что его код дает ожидаемый массив.

Снова спасибовсе за помощь!

Матеус

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