Как рассчитать среднесуточное значение на основе почасовых данных netCDF ERA5?

Привет всем дорогие,

Прошу прощения за повторение вопроса. Я загрузил и объединил почасовые данные о температуре точки росы ERA5 (d2m_wb.nc) с веб-платформы Copernicus. Теперь я хочу рассчитать среднесуточное значение на основе почасовых данных d2m_wb.nc. Метки времени: 00, 01, 02 ... 23. ЕЦСПП предоставил пример расчета суточного общего количества осадков (https://confluence.ecmwf.int/display/CKB/ERA5%3A+How+to+calculate+daily+total+precipitation). В нем говорится, что для покрытия общего количества осадков за 1 января 2017 года нам нужны данные за два дня. (a) 1 января 2017 года time = 01-23 предоставит вам данные об общих осадках для покрытия 00-23 UTC на 1 января 2017 года (b) 2 января 2017 года time = 00 предоставит вам данные об общих осадках для покрытия 23-24 UTC для 1 января 2017 года. Январь 2017 г.

Это означает, что мне нужно сместить -1hourметка времени для учета шага (b). Соответственно, я сделал это с помощью операторов климатических данных (CDO).

      cdo daymean -shifttime,-1hour in.nc out.nc

и получил следующий результат.

      cdo sinfo d2m_wb.nc
   File format : NetCDF2
    -1 : Institut Source   T Steptype Levels Num    Points Num Dtype : Parameter ID
     1 : unknown  unknown  v instant       1   1       475   1  F64  : -1
   Grid coordinates :
     1 : lonlat                   : points=475 (19x25)
                              lon : 85.5 to 90 by 0.25 degrees_east
                              lat : 21.5 to 27.5 by 0.25 degrees_north
   Vertical coordinates :
     1 : surface                  : levels=1
   Time coordinate :  25904 steps
     RefTime =  1900-01-01 00:00:00  Units = hours  Calendar = gregorian  Bounds = true
  YYYY-MM-DD hh:mm:ss  YYYY-MM-DD hh:mm:ss  YYYY-MM-DD hh:mm:ss  YYYY-MM-DD hh:mm:ss
  1949-12-31 23:00:00  1950-01-01 11:00:00  1950-01-02 11:00:00  1950-01-03 11:00:00
  1950-01-04 11:00:00  1950-01-05 11:00:00  1950-01-06 11:00:00  1950-01-07 11:00:00
  1950-01-08 11:00:00  1950-01-09 11:00:00  1950-01-10 11:00:00  1950-01-11 11:00:00
  1950-01-12 11:00:00  1950-01-13 11:00:00  1950-01-14 11:00:00  1950-01-15 11:00:00
  1950-01-16 11:00:00  1950-01-17 11:00:00  1950-01-18 11:00:00  1950-01-19 11:00:00
  1950-01-20 11:00:00  1950-01-21 11:00:00  1950-01-22 11:00:00  1950-01-23 11:00:00
  1950-01-24 11:00:00  1950-01-25 11:00:00  1950-01-26 11:00:00  1950-01-27 11:00:00
  1950-01-28 11:00:00  1950-01-29 11:00:00  1950-01-30 11:00:00  1950-01-31 11:00:00
  1950-02-01 11:00:00  1950-02-02 11:00:00  1950-02-03 11:00:00  1950-02-04 11:00:00
  1950-02-05 11:00:00  1950-02-06 11:00:00  1950-02-07 11:00:00  1950-02-08 11:00:00
  1950-02-09 11:00:00  1950-02-10 11:00:00  1950-02-11 11:00:00  1950-02-12 11:00:00
  1950-02-13 11:00:00  1950-02-14 11:00:00  1950-02-15 11:00:00  1950-02-16 11:00:00
  1950-02-17 11:00:00  1950-02-18 11:00:00  1950-02-19 11:00:00  1950-02-20 11:00:00
  1950-02-21 11:00:00  1950-02-22 11:00:00  1950-02-23 11:00:00  1950-02-24 11:00:00
  1950-02-25 11:00:00  1950-02-26 11:00:00  1950-02-27 11:00:00  1950-02-28 11:00:00
   ................................................................................
   ................................................................................
   ................................................................................
   .................
  2020-10-03 11:00:00  2020-10-04 11:00:00  2020-10-05 11:00:00  2020-10-06 11:00:00
  2020-10-07 11:00:00  2020-10-08 11:00:00  2020-10-09 11:00:00  2020-10-10 11:00:00
  2020-10-11 11:00:00  2020-10-12 11:00:00  2020-10-13 11:00:00  2020-10-14 11:00:00
  2020-10-15 11:00:00  2020-10-16 11:00:00  2020-10-17 11:00:00  2020-10-18 11:00:00
  2020-10-19 11:00:00  2020-10-20 11:00:00  2020-10-21 11:00:00  2020-10-22 11:00:00
  2020-10-23 11:00:00  2020-10-24 11:00:00  2020-10-25 11:00:00  2020-10-26 11:00:00
  2020-10-27 11:00:00  2020-10-28 11:00:00  2020-10-29 11:00:00  2020-10-30 11:00:00
  2020-10-31 11:00:00  2020-11-01 11:00:00  2020-11-02 11:00:00  2020-11-03 11:00:00
  2020-11-04 11:00:00  2020-11-05 11:00:00  2020-11-06 11:00:00  2020-11-07 11:00:00
  2020-11-08 11:00:00  2020-11-09 11:00:00  2020-11-10 11:00:00  2020-11-11 11:00:00
  2020-11-12 11:00:00  2020-11-13 11:00:00  2020-11-14 11:00:00  2020-11-15 11:00:00
  2020-11-16 11:00:00  2020-11-17 11:00:00  2020-11-18 11:00:00  2020-11-19 11:00:00
  2020-11-20 11:00:00  2020-11-21 11:00:00  2020-11-22 11:00:00  2020-11-23 11:00:00
  2020-11-24 11:00:00  2020-11-25 11:00:00  2020-11-26 11:00:00  2020-11-27 11:00:00
  2020-11-28 11:00:00  2020-11-29 11:00:00  2020-11-30 11:00:00  2020-12-31 23:00:00
cdo    sinfo: Processed 1 variable over 25904 timesteps [6.03s 37MB

В этом случае временной шаг показывает 11:00:00 (с 01.01.1950 г.). Думаю, должно быть 12:00:00. Что я здесь плохого сделал? Любые предложения будут высоко оценены? Спасибо.

3 ответа

Этот вывод кажется правильным. CDO должен принять решение о том, какой временной интервал использовать при усреднении. В этом случае берется середина каждого дня, то есть 11:00.

Вы заметите, что в первый день 23:00, так как время только одно.

Однако непонятно, зачем вам сдвигать время на один час назад. Ваш код на самом деле не вычисляет среднесуточное значение. Вместо этого это среднее значение последних 23 часов одного дня и первого часа следующего. Просто измените свой вызов CDO на следующий, и все будет в порядке:

      cdo daymean in.nc out.nc

Ответ Роберта Уилсона правильный, я просто хотел быстро пояснить, что путаница здесь связана с разницей между

  • Мгновенные поля: такие как облака, водяной пар, температура, ветер и т. Д., Это поля, действительные в данный момент.
  • Накопленные поля: такие как потоки излучения, потоки скрытого и явного тепла, осадки и т. Д., Они накапливаются в течение определенного периода времени, а отметка времени помещается в конце окна.

Таким образом, для мгновенных полей Роберт прав, что вы не хотите сдвигаться, если вы считаете, что 00Z будет в следующий день, но вы также можете обоснованно утверждать, что полночь должна быть включена в предыдущий день (таким образом, вам понадобится смещение), так как лежит на границе. Согласно условию, вы не переключаетесь и считайте 00 ... 23 как один день ...

Что касается потоков, в этом посте также есть более подробная информация: Расчет суточного общего количества осадков ERA5 с использованием CDO

У меня также есть аналогичная проблема с 3-часовыми данными о температуре GLDAS.

Допустим, я использую данные за 1948 год, и первые данные будутGLDAS_NOAH025_3H.A19480101.0300.020.nc4что является значением температуры для1948-01-01 00:00:00 -- 1948-01-01 03:00:00и последние данные с 1948 годом, написанным в имени файла,GLDAS_NOAH025_3H.A19481231.2100.020.nc4что является значением температуры для1948-12-31 18:00:00 -- 1948-12-31 21:00:00

я добавилGLDAS_NOAH025_3H.A19490101.0000.020.nc4в папку 1948 и объединить все файлы в один netcdf, используя:

      cdo mergetime *.nc4 merge_1948.nc4

Затем я пытаюсь рассчитать среднее дневное значение, используя:

      cdo daymean merge_1948.nc4 tmean_1948.nc4

К сожалению, общий файл (время) составляет 367, а первые данные1948-01-01 00:00:00 -- 1948-01-01 21:00:00и последние данные1948-12-31 21:00:00 -- 1949-01-01 00:00:00

Итак, я попытался использоватьshifttimeи это решило проблему.

      cdo daymean -shifttime,-3hour merge_1948.nc4 temp.nc4
cdo -shifttime,3hour temp.nc4 tmean_1948.nc4

и первые данные 1948-01-01 00:00:00 -- 1948-01-02 00:00:00 и последние данные 1948-12-31 00:00:00 -- 1949-01-01 00 :00:00

Другие вопросы по тегам