Slice NetCdf Dataset

Я хочу взять подмножество набора данных netcdf, ограниченного координатами lat / lon.

<xarray.Dataset>
Dimensions:              (ICcheckNameLen: 72, ICcheckNum: 55, QCcheckNameLen: 60, QCcheckNum: 10, maxAutoStaLen: 6, maxLocationLen: 24, maxMETARLen: 256, maxRepLen: 6, maxSkyCover: 6, maxSkyLen: 8, maxStaNamLen: 5, maxStaticIds: 10000, maxWeatherLen: 25, nInventoryBins: 24, recNum: 8329, totalIdLen: 6)
Dimensions without coordinates: ICcheckNameLen, ICcheckNum, QCcheckNameLen, QCcheckNum, maxAutoStaLen, maxLocationLen, maxMETARLen, maxRepLen, maxSkyCover, maxSkyLen, maxStaNamLen, maxStaticIds, maxWeatherLen, nInventoryBins, recNum, totalIdLen
Data variables:
    nStaticIds           int32 ...
    staticIds            (maxStaticIds, totalIdLen) |S1 ...
    lastRecord           (maxStaticIds) int32 ...
    invTime              (recNum) int32 ...
    prevRecord           (recNum) int32 ...
    inventory            (maxStaticIds) int32 ...
    globalInventory      int32 ...
    firstOverflow        int32 ...
    isOverflow           (recNum) int32 ...
    firstInBin           (nInventoryBins) int32 ...
    lastInBin            (nInventoryBins) int32 ...
    secondsStage1_2      (recNum) int32 ...
    secondsStage3        (recNum) int32 ...
    wmoId                (recNum) int32 ...
    stationName          (recNum, maxStaNamLen) |S1 ...
    locationName         (recNum, maxLocationLen) |S1 ...
    QCT                  (QCcheckNum, QCcheckNameLen) |S1 ...
    ICT                  (ICcheckNum, ICcheckNameLen) |S1 ...
    latitude             (recNum) float32 ...
    longitude            (recNum) float32 ...
    elevation            (recNum) float32 ...

Я пробовал несколько методов, основанных на Help1 и Help2, чтобы установить границы, которые должны находиться между широтой [20, 53] и долгота [-131, -62]. Доступ к набору данных можно получить на странице NetCDF Data .

Когда я использую приведенное ниже, он говорит: «ValueError: измерения или многоиндексные уровни ['широта', 'долгота'] не существуют»

import xarray as xr
ds = xr.open_dataset('/home/awips/python-awips/ups/20181110_1600.nc',
                     decode_cf=False)
print(ds)
lat_bnds, lon_bnds = [20, 53], [-131, -62]
ds.sel(latitude=slice(*lat_bnds), longitude=slice(*lon_bnds))
ds.to_netcdf(path='/home/awips/python-awips/ups/subset.nc')

Когда я пробую следующее, он обрабатывает данные, но не удаляет данные.

import xarray as xr
ds = xr.open_dataset('/home/awips/python-awips/ups/20181110_1600.nc', decode_cf=True)

ds.where((-131 < ds.longitude) & (ds.longitude < -62)
         & (20 < ds.latitude) & (ds.latitude < 53), drop=True)
ds.to_netcdf(path='/home/awips/python-awips/ups/subset.nc')

Любые идеи?


person WxJack    schedule 15.11.2018    source источник
comment
Ваш второй подход выглядит как правильный способ решить эту проблему для случаев, когда latitude и longitude не являются измерениями. Я удивлен, что он не удаляет никаких данных - вы уверены, что есть записи с долготой / широтой за пределами этих границ?   -  person shoyer    schedule 16.11.2018
comment
Я изменил код на ds.where((-95 < ds.longitude) & (ds.longitude < -80) & (30 < ds.latitude) & (ds.latitude < 35), drop=True). Создаваемый им файл вдвое больше оригинала, поэтому где-то что-то не так. Значения широты все еще там для -75.   -  person WxJack    schedule 16.11.2018
comment
@shoyer, мне удалось удалить данные, назначив их новой переменной, но я не уверен, как правильно сохранить новые данные. Что работало как latitude = ds.latitude.where ((ds.latitude ›20) & (ds.latitude‹ 53), drop = True), longitude = ds.longitude.where ((ds.longitude ›-131) & ( ds.longitude ‹-62), drop = True). Есть еще идеи?   -  person WxJack    schedule 16.11.2018


Ответы (1)


Операции Xarray обычно возвращают новые объекты вместо изменения объектов на месте. Поэтому вам нужно присвоить результат where новой переменной и вместо этого сохранить, например,

ds2 = ds.where((-131 < ds.longitude) & (ds.longitude < -62)
               & (20 < ds.latitude) & (ds.latitude < 53), drop=True)
ds2.to_netcdf(path='/home/awips/python-awips/ups/subset.nc')
person shoyer    schedule 16.11.2018
comment
Если я использую ds2 = ds.where((ds.latitude > 20) & (ds.latitude < 50) & (ds.longitude > -131) & (ds.longitude < -62), drop=True) ds2.to_netcdf(path='/home/awips/python-awips/ups/subset.nc'), размер файла резко увеличивается, и в нем есть множество повторяющихся переменных, которых раньше не было. - person WxJack; 18.11.2018
comment
Я не знаю, что происходит с дополнительными переменными, но прочтите этот выпуск, чтобы обсудить, что (возможно) происходит с размерами файлов: github.com/pydata/xarray/issues/1572 - person shoyer; 19.11.2018
comment
@shoyer, это также может быть связано с переменными, не проиндексированными по широте / долготе, которые транслируются в соответствии с условием where. Синтаксис, который вы предлагаете, следует использовать только для переменных в наборе данных, которые индексируются latitude и longitude, не так ли? - person Michael Delgado; 26.11.2018