Как вернуть сезон каждого годового максимального значения?

#python #python-xarray #cdo-climate

Вопрос:

У меня есть ежедневный набор данных netcdf. Я хочу получать максимальное значение каждого года и возвращать сезон, в котором находится максимальное значение.

Я попробовал xarray.dataArray.idxmax, ниже приведен пример, он может возвращать метку координат максимального значения вдоль измерения.

В:

 import xarray as xr  array = xr.DataArray(  [  [2.0, 1.0, 2.0, 0.0, -2.0],  [-4.0, np.NaN, 2.0, np.NaN, -2.0],  [np.NaN, np.NaN, 1.0, np.NaN, np.NaN],  ],  dims=["y", "x"],  coords={"y": [-1, 0, 1], "x": np.arange(5.0) ** 2},  ) array.max(dim="x")  

из:

 lt;xarray.DataArray (y: 3)gt; array([2., 2., 1.])  Coordinates:  * y (y) int64 -1 0 1  

В:

 array.argmax(dim="x")  

из:

 lt;xarray.DataArray (y: 3)gt; array([0, 2, 2])  Coordinates:  * y (y) int64 -1 0 1  

Я знаю ксаррея.dataArray.idxmax может возвращать день всех лет. но я не могу превратить этот день в сезон каждого года. Самое сложное для меня-это зима, потому что зима длится два года.

Как я могу этого достичь?

Ответ №1:

Вы отметили вопрос cdo, и ответ cdo на первую часть довольно прост, получить максимум за год-это просто

 cdo yearmax in.nc out.nc   

Это первая часть вашего вопроса. Но с точки зрения сезона, в который это происходит, как вы определяете свои сезоны? ДИДЖЕЙ, МАМА, ДЖИЯ и СЫН? Можете ли вы прояснить это в своем вопросе? Или было бы достаточно знать месяц (или даже саму дату?).

Предполагая, что это стандартные сезоны, определенные CDO, вы можете попробовать что-то в этом роде, где вы создаете маску нуля для всех дней ниже максимума, 1=день максимума. Затем вы делаете сезонную сумму, а затем снова маскируетесь для ненулевых сезонов… Но этот метод требует, чтобы вы разделили файл на годы с помощью yearsplit :

 # split the files into years, year2010.nc year2011.nc  cdo splityear t2m_daymean.nc year  # loop over the years,  for y in $(seq 2010 2020) ; do   # 1 for day of max and 0 otherwise  cdo gec,0 -sub year${y}.nc -yearmax year${y}.nc mask${y}.nc   # Now do the seasonal sum, will be gt;0 for seasonal with max,  # then convert this to 1, 0 otherwise  cdo -gt,0 -seassum mask${y}.nc seas_max${y}.nc done   

теперь файлы seas_max2010 и т. Д. Будут иметь 4 временных среза для 4 сезонов с датами, такими как: 2019-01-30 2019-04-15 2019-07-16 2019-10-16 и 0 для всех сезонов, кроме того, с максимальным значением…

Вы можете объединить файлы обратно вместе с cdo merge или cdo mergetime , если хотите.