DataArray.mean не сохраняет координаты - PullRequest
2 голосов
/ 09 ноября 2019

DataArray.mean не сохраняет координату, которая зависит от размера, к которому применяется среднее значение.

ПРИМЕЧАНИЕ: XLAT и XLONG не зависят от времени;однако некоторые файлы netcdf имеют координату времени вдоль этих двух.

У меня есть этот файл netcdf wrfout_d03.nc, в котором я открываю файл с помощью:

ds = xr.open_dataset('/Users/jacob/Desktop/wrfpy/wrfout_d03_may.nc')

Thisзатем дает объект DataSet:

<xarray.Dataset>
Dimensions:                (Time: 193, bio_emissions_dimension_stag: 41, bottom_top: 50, bottom_top_stag: 51, klevs_for_dvel: 1, seed_dim_stag: 12, soil_layers_stag: 4, south_north: 115, south_north_stag: 116, west_east: 115, west_east_stag: 116)
Coordinates:
    XLAT                   (Time, south_north, west_east) float32 ...
    XLONG                  (Time, south_north, west_east) float32 ...
    XTIME                  (Time) datetime64[ns] ...
    XLAT_U                 (Time, south_north, west_east_stag) float32 ...
    XLONG_U                (Time, south_north, west_east_stag) float32 ...
    XLAT_V                 (Time, south_north_stag, west_east) float32 ...
    XLONG_V                (Time, south_north_stag, west_east) float32 ...
Dimensions without coordinates: Time, bio_emissions_dimension_stag, bottom_top, bottom_top_stag, klevs_for_dvel, seed_dim_stag, soil_layers_stag, south_north, south_north_stag, west_east, west_east_stag
Data variables:
datavars...

Затем я получаю доступ к переменной PM2_5_DRY со следующим кодом:

pm25 = ds.PM2_5_DRY

Полученный объект pm25 имеет следующие размеры и координаты:

<xarray.DataArray 'PM2_5_DRY' (Time: 193, bottom_top: 50, south_north: 115, west_east: 115)>
[127621250 values with dtype=float32]
Coordinates:
    XLAT     (Time, south_north, west_east) float32 ...
    XLONG    (Time, south_north, west_east) float32 ...
    XTIME    (Time) datetime64[ns] ...
Dimensions without coordinates: Time, bottom_top, south_north, west_east
Attributes:
    FieldType:    104
    MemoryOrder:  XYZ
    description:  pm2.5 aerosol dry mass
    units:        ug m^-3
    stagger: 

Затем я манипулирую объектом pm25 и получаю среднее значение в измерении time через:

pm25_mean = pm25.mean(dim='Time', keep_attrs = True)

Полученный объект является массивом данных, но без координат XLAT или XLON.

<xarray.DataArray 'PM2_5_DRY' (bottom_top: 50, south_north: 115, west_east: 115)>
array([[[14.73083   , 14.756626  , 14.796355  , ..., 20.325712  ,
         20.855696  , 21.381271  ],
        [14.651459  , 14.34477   , 14.371858  , ..., 18.00389   ,
         18.4109    , 21.337002  ],
        [14.59026   , 14.257076  , 14.293012  , ..., 17.391146  ,
         18.217058  , 20.882664  ],
        ...,
        [27.356459  , 27.21468   , 27.757051  , ...,  8.084272  ,
          8.010168  ,  7.989942  ],
        [27.185486  , 27.02623   , 27.776043  , ...,  7.944748  ,
          7.8795266 ,  7.8552976 ],
        [26.926008  , 27.724253  , 28.427626  , ...,  7.8269224 ,
          7.773637  ,  7.741844  ]],

Dimensions without coordinates: bottom_top, south_north, west_east
Attributes:
    FieldType:    104
    MemoryOrder:  XYZ
    description:  pm2.5 aerosol dry mass
    units:        ug m^-3
    stagger:

Следующий код для проверки дает:

pm25_mean.coords

Coordinates:
*empty*

Я попытался посмотреть надокументация для средней функции в xarray;однако я не смог найти никакой опции, чтобы скопировать координаты из предыдущего объекта в новый.

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

Кроме того, это как-то связано с этим?

XLAT     (Time, south_north, west_east) float32

XLAT - это многомерная координата, которая также зависит от времени. Поскольку я получил среднее значение в измерении Time, число измерений pm25 было уменьшено до 3 вместо 4. Может ли это как-то повлиять и на координаты?

Мне нужен конечный объект, чтобы иметь координаты XLAT иXLONG, так как я буду визуализировать это.

Спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Вам просто нужно преобразовать ваши координатные переменные из 3 в 2 измерения.

d = xr.open_dataset('.../pm25_sample.nc')
d['XLAT'] = d.XLAT.mean(dim = 'Time')
d['XLONG'] = d.XLONG.mean(dim = 'Time')

d['PM2_5_DRY'].mean(dim = 'Time')

     ...,
    [ 0.03839084,  0.03837739,  0.03835952, ...,  0.03414929,
      0.03412561,  0.03410038],
    [ 0.03837854,  0.03836632,  0.03834687, ...,  0.03414606,
      0.0341224 ,  0.03409675],
    [ 0.03836945,  0.03835024,  0.03833132, ...,  0.03414177,
      0.03411727,  0.03409337]]], dtype=float32)
Coordinates:
    XLAT     (south_north, west_east) float32 14.086891 14.086907 ... 15.111996
    XLONG    (south_north, west_east) float32 120.49799 120.50717 ... 121.55791
Dimensions without coordinates: bottom_top, south_north, west_east
0 голосов
/ 10 ноября 2019

Кажется, в xarray нет прямого решения этого (насколько я знаю), но я нашел решение через NCO.

Это пришло из другого поста здесь. Вот шаги, которые я предпринял для решения этой проблемы.

Во-первых, причина, по которой XLAT и XLONG не представлены в окончательном массиве данных, состоит в том, что эти координаты зависят от времени.

В соответствии с этим потоком: Установка координаты постоянной во времени

  1. Мы должны взять файл NetCDF и отделить интересующую переменную (зависящую от времени).
  2. Мы усредняем XLAT и XLONG по времени и помещаем их в другой файл nc.
  3. Мы добавляем оба файла вместе, чтобы получить результирующие независимые от времени XLAT и XLONG.
ncks -v variable input.nc variable.nc
ncwa -a Time -v XLAT,XLONG input.nc latlon.nc
ncks -A latlon.nc variable.nc

Таким образом, при доступе к файлу в xarray и вычислении среднего значения мы получаем следующий массив данных:

<xarray.DataArray 'PM2_5_DRY' (bottom_top: 50, south_north: 115, west_east: 115)>
array([[[14.73083   , 14.756626  , 14.796355  , ..., 20.325712  ,
         20.855696  , 21.381271  ],
        [14.651459  , 14.34477   , 14.371858  , ..., 18.00389   ,
         18.4109    , 21.337002  ],
        [14.59026   , 14.257076  , 14.293012  , ..., 17.391146  ,
         18.217058  , 20.882664  ],
        ...,
Coordinates:
    XLAT     (south_north, west_east) float32 ...
    XLONG    (south_north, west_east) float32 ...
Dimensions without coordinates: bottom_top, south_north, west_east

Надеюсь, что это также помогает другим людямта же проблема!

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