Как преобразовать xarray MFdataset в несколько геотифов?Попытка двух методов и до сих пор не удалось - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь преобразовать несколько файлов NetCDF4 в растры GeoTIFF, уменьшая при этом частоту дискретизации данных с ежедневной частоты до ежемесячной (без учета NaN).К сожалению, я получаю ошибки, когда добираюсь до шага, когда я хочу записать данные в геотарифы.

Было легко открывать и уменьшать выборку файлов с помощью xarray (потрясающие функциональные возможности по сравнению с R, с которыми я привык работать), сохраняя только одну переменную, как я хотел, и вычисляя средние месячные значения из ежедневных значений, ноЯ застрял, пытаясь экспортировать / конвертировать мои результаты в несколько * .tif файлов.

Даже пытался конвертировать его в несколько файлов NetCDF3, так как я могу легко конвертировать их в геотиф, но тоже не получилось.

Входными данными являются 4018 файлов ESA влажности почвы ".nc4" в суточной частоте, охватывающих весь земной шар, но неполных на каждом шаге (данные заполнены только полосами за каждый день, остальная часть пуста / нет данных),поэтому я хочу игнорировать NaN для расчета среднемесячных значений.

В целом, эти 4018 дней и 132 месяца (11 лет), и мой набор данных xarray, полученный из кода ниже, похоже, показывают, что, как и ожидалось.

import xarray as xr

# opening the files into an array

mfdataDIR = 'C:/full_path_here/*.nc'

DS = xr.open_mfdataset(mfdataDIR)


# downsampling it from daily to monthly means while keeping attributes and ignoring NAs 

monthly_data = DS.sm.resample(time="1M").mean(skipna= True, keep_attrs=True)

Я получил следующее предупреждение: «Размер сокращения по умолчанию будет изменен на групповое измерение после xarray 0.12. Чтобы отключить это предупреждение, явно передайте dim = xarray.ALL_DIMS. Skipna = skipna, allow_lazy =Правда, ** kwargs) "Не уверен, что это имеет значение, но результаты кажутся нормальными, когда я печатаю xarray month_data.

# Now, trying to convert to GeoTIFFs using Robin Wilson's rasterio_to_xarray (and vice-versa) script (full script can be found on link below).

import sys

sys.path.insert(0, 'C:/path_to_py_script/')

import xarray_to_rasterio as xarrast

xarrast.xarray_to_rasterio_by_band(monthly_data, 'C:/path_here/%s.tif', dim= 'time')

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

Сценарий, составленный Робином Уилсоном, который идеально подходит для моих целей, был получен здесь: https://github.com/robintw/XArrayAndRasterio/blob/master/rasterio_to_xarray.py

Я вижу ошибки, прослеженные до строки 84:

82  if len(xa.shape) == 2:
83        count = 1
84        height = xa.shape[0]
85        width = xa.shape[1]
86        band_indicies = 1
87   else:

и строка 122:

122  xarray_to_rasterio(data, filename)

Так что, похоже, мое время затемнения, которое, как я надеялся, будет считаться полосами, не соответствует ожиданиям сценария, и поэтому оно терпит неудачу.А также, я, кажется, запутался с параметром «filename».

Не знаю как ... Могу ли я использовать этот скрипт или изменить его, чтобы сделать то, что я хочу?(чтобы сохранить 132 ".tif" файла, соответствующих 132 уровням затемнения)


# Second option, not ideal but could still help me, if it hadn't also failed:


mDS = monthly_data.to_dataset()

paths = ['C:/path_here/%s.nc' ]
xr.save_mfdataset(mDS, paths, format='NETCDF3_CLASSIC')

got this error: "TypeError: save_mfdataset only supports writing Dataset objects, received type <class 'str'>"

Я думаю, что мое отсутствие знаний Python мешает мне, так как я продолжаю получать ошибки в обеих процедурах (xarray в GeoTIFF илиxarrayDataset для NetCDF3 classic).

Когда я проверяю month_data, я вижу то, что ожидал: только переменная "sm", все три измерения и 132 "значения" времени.

Может кто-нибудь помочь, пожалуйста?

...