рассчитать среднее значение с использованием комбинации «год + месяц» в xarray - PullRequest
2 голосов
/ 23 мая 2019

У меня есть файл netcdf с ежедневными данными за 5 лет (с 2011 по 2015).Я хочу рассчитать среднемесячные значения для данных, используя XArray в Python.

netcdf file:////test/Combined.nc {
  dimensions:
    latitude = 681;
    longitude = 841;
    time = 1826;
  variables:
    double latitude(latitude=681);
      :_FillValue = NaN; // double
      :name = "latitude";
      :long_name = "latitude";
      :units = "degrees_north";
      :standard_name = "latitude";

    double longitude(longitude=841);
      :_FillValue = NaN; // double
      :name = "longitude";
      :long_name = "longitude";
      :units = "degrees_east";
      :standard_name = "longitude";

    long time(time=1826);
      :name = "time";
      :long_name = "time";
      :standard_name = "time";
      :units = "days since 2011-01-01 00:00:00";
      :calendar = "proleptic_gregorian";

    float PET(time=1826, latitude=681, longitude=841);
      :_FillValue = -999.0f; // float
      :name = "PET";
      :long_name = "Potential evapotranspiration";
      :units = "mm";
      :standard_name = "PET";      

  :var_name = "PET";
}

Я пытался использовать groupby для вычисления среднемесячных значений:

import numpy as np
import xarray as xr

ds = xr.open_dataset("c:\\test\\Combined.nc")
ds_avg = ds.PET.groupby('time.month').mean(dim='time')
ds_avg.to_netcdf("C:\\test\\Combined_avg.nc") 

Но проблема с приведенным выше кодом заключается в том, что файл с комбинированным среднемесячным значением (с 2011 г.)до 2015 года).Это означает, что у меня есть 12 месяцев в файле результатов.Это не то, что я хочу сделать.Я хочу рассчитать среднемесячное значение за январь 2011 года, февраль 2011 года, март 2011 года по декабрь 2015 года, чтобы я получил 12 * 5 месяцев в файле результатов.Таким образом, это означает, что группа должна происходить не в time.month, а в time.year: time.month.Как мне это сделать?

Спасибо

1 Ответ

1 голос
/ 23 мая 2019

Вы должны использовать resample doc с периодичностью один месяц. Тогда:

ds_avg = ds.resample('1M').mean()

Если вас интересуют другие подобные (простые) манипуляции, взгляните на этот блокнот, который мы настроили для набора данных ERA-NUTS .

Другой пример использования другого набора данных:

<xarray.Dataset>
Dimensions:    (bnds: 2, latitude: 61, longitude: 91, time: 218)
Coordinates:
  * longitude  (longitude) float32 -22.5 -21.75 -21.0 -20.25 ... 43.5 44.25 45.0
  * latitude   (latitude) float32 72.0 71.25 70.5 69.75 ... 28.5 27.75 27.0
  * time       (time) datetime64[ns] 2000-01-16T15:00:00 ... 2018-01-01T03:00:00
Dimensions without coordinates: bnds
Data variables:
    time_bnds  (time, bnds) datetime64[ns] ...
    ssrdc      (time, latitude, longitude) float64 ...
    ssrd       (time, latitude, longitude) float64 ...

И затем применяя повторную выборку:

In [13]: d.resample(time = '1Y').mean()                                                                                           
Out[13]: 
<xarray.Dataset>
Dimensions:    (latitude: 61, longitude: 91, time: 19)
Coordinates:
  * time       (time) datetime64[ns] 2000-12-31 2001-12-31 ... 2018-12-31
  * longitude  (longitude) float32 -22.5 -21.75 -21.0 -20.25 ... 43.5 44.25 45.0
  * latitude   (latitude) float32 72.0 71.25 70.5 69.75 ... 28.5 27.75 27.0
Data variables:
    ssrdc      (time, latitude, longitude) float64 5.033e+05 ... 1.908e+05
    ssrd       (time, latitude, longitude) float64 4.229e+05 ... 1.909e+05
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...