#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
, если хотите.