![](/img/trans.png)
[英]Daily anomalies using climate data operator (CDO) in Cygwin (Windows 10)
[英]How to count number of events of length 5<=N<10 days meeting a set condition using CDO?
我需要有關對 .netcdf 文件進行 CDO 操作的幫助。 我在網格區域從 ERA5 下載了 40 年的數據集,並使用 cdo 將范圍 (30-50) 的變量值屏蔽為 1,將其他值屏蔽為 0。
cdo -expr,'var2=var*(var>=30 && var<50)' data1.nc data2.nc
現在我想計算每個網格單元在過去 40 年中連續 5 天但少於 10 天記錄 var2= 1 的次數。 可以使用 cdo 或 nco 嗎?
首先,我假設您的輸入已轉換為每日,您不說。
然后你還需要澄清這個問題。 你的標題本來是說“如何計算天數?”,但是有點含糊?
假設您有這樣一個代表 8 天活動的系列:
0 0 1 1 1 1 1 1 1 1 0 0 0 0
這算作單次出現嗎? 你的文字似乎暗示是這種情況,但標題不是,我想你想知道“事件數”而不是“天數”,所以我編輯了你的標題以與問題的正文一致,我希望這個解釋是正確的。
我認為你可以做到,但解決方案有點冗長。 您可以使用runsum
為任何一天提供一個“1”,即 1 並且在一系列 N 天的末尾,如下所示:
cdo gec,N -runsum,N in.nc out5.nc
但這並不能完全回答你的問題。 例如,如果 N=5 這會將上述系列轉換為:
0 0 0 0 0 0 1 1 1 1 0 0 0 0
即在 5 天的系列結束時還有 4 天。
我們如何獲得事件長度的上限? 好吧,如果我們對超過 10 天的事件進行相同的計算,然后加在一起,我們得到
所以我們只需添加兩個系列並挑選出 1 以獲得您需要的事件長度范圍:
cdo gec,10 -runsum,10 in.nc out10.nc
# only keep events of 5,6,7,8 and 9 days in length:
cdo eqc,1 -add out5.nc out10.nc out5-10.nc
好的,現在我們有一個文件,當它處於至少 5 天但少於 10 天的系列結束時,var=1。
現在這是很酷的部分,我們可以使用相同的技術使用 runmean/runsum 來獲取每個系列的開始和結束,然后我們可以將這些事件相加。 如果我們應用大小為 2 的runsum
運行總和,這會為“0 1”或“1 0”序列生成 1,即它會選取每個事件的起點和終點。
cdo eqc,1 -runsum,2 out5-10.nc out_start_end.nc
此命令將我們的示例系列變為以下內容,因為我們只看到了一系列“0 1”或“1 0”結果為 1:
0 0 0 0 0 0 1 0 0 1 0 0 0 0
現在我們只需要及時求和並除以 2(我告訴過你這是啰嗦了!)
cdo divc,2 -timsum out_start_end.nc number_of_events.nc
噠噠!
請注意 1如果整個輸入序列在事件中結束,例如 0 0 1 1 1,此方法將把它算作一個“半”事件,因為您只選擇了開始。 如果這讓您不高興,請向下舍入到最接近的 integer。
把這些放在一起(你可能可以 pipe 來組合其中的一些),這里是涉及 10 個 cdo 命令的整個解決方案的總結:
cdo gec,5 -runsum,5 in.nc out5.nc
cdo gec,10 -runsum,10 in.nc out10.nc
cdo eqc,1 -add out5.nc out10.nc out5-10.nc
cdo eqc,1 -runsum,2 out5-10.nc out_start_end.nc
cdo divc,2 -timsum out_start_end.nc number_of_events.nc
注意 2 , runsum
命令將使用 window 中點作為日期/時間戳,但這對於此用例並不重要。 如果有人還想使用 outN.nc 文件來查看事件日期,那么通常使用--timestat_date last
來延遲時間戳,有關詳細信息,請參閱此視頻。
注釋 3如果您將事件中的一系列天數相加,您現在可以將其除以事件數以獲得平均事件長度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.