使用 CDO 从 netcdf 计算降水量的月平均值和年总和

Calculate monthly average and annual sum of precipitation from netcdf with CDO

我正在使用 CRU ts_4.04 数据学习 netCDF 和 CDO。我想计算伦敦降水量的月平均值和年总和。我写道:

#!/usr/bin/bash
lon=-0.11
lat=51.49
PREFNAME="/myHD/CRU4.04/pre/cru_ts4.04.1901.2019.pre.dat.nc"
OUTFNAME="outfile-"
echo "1970-2000 monthly average and annual sum of precipitations in London"
cdo remapnn,lon=$lon/lat=$lat $PREFNAME               $OUTFNAME"place.nc"
cdo selvar,pre                $OUTFNAME"place.nc"     $OUTFNAME"var.nc"
cdo selyear,1970/2000         $OUTFNAME"var.nc"       $OUTFNAME"years.nc"
cdo ymonmean                  $OUTFNAME"years.nc"     $OUTFNAME"yearsmean.nc"
cdo timcumsum                 $OUTFNAME"yearsmean.nc" $OUTFNAME"yearsum.nc"
cdo info $OUTFNAME"yearsum.nc"
cdo info $OUTFNAME"yearsmean.nc"
exit

我得到:

MyPC:~/workbench01$ ./gotit2.sh 
1970-2000 monthly average and annual sum of precipitations in London
cdo    remapnn: Nearest neighbor weights from lonlat (720x360) to lonlat (1x1) grid, with source mask (67420)
cdo    remapnn: Processed 2 variables over 1428 timesteps [2.64s 60MB].
cdo    selname: Processed 2 variables over 1428 timesteps [0.01s 52MB].
cdo    selyear: Processed 1 variable over 1428 timesteps [0.00s 51MB].
cdo    ymonmean: Processed 1 variable over 372 timesteps [0.00s 51MB].
cdo    timcumsum: Processed 1 variable over 12 timesteps [0.00s 51MB].
    -1 :       Date     Time   Level Gridsize    Miss :     Minimum        Mean     Maximum : Parameter ID
     1 : 2000-01-16 00:00:00       0        1       0 :                  81.229             : -1            
     2 : 2000-02-15 00:00:00       0        1       0 :                  132.26             : -1            
     3 : 2000-03-16 00:00:00       0        1       0 :                  189.70             : -1            
     4 : 2000-04-16 00:00:00       0        1       0 :                  244.82             : -1            
     5 : 2000-05-16 00:00:00       0        1       0 :                  298.52             : -1            
     6 : 2000-06-16 00:00:00       0        1       0 :                  356.92             : -1            
     7 : 2000-07-16 00:00:00       0        1       0 :                  402.39             : -1            
     8 : 2000-08-16 00:00:00       0        1       0 :                  456.03             : -1            
     9 : 2000-09-16 00:00:00       0        1       0 :                  527.19             : -1            
    10 : 2000-10-16 00:00:00       0        1       0 :                  605.04             : -1            
    11 : 2000-11-16 00:00:00       0        1       0 :                  682.58             : -1            
    12 : 2000-12-16 00:00:00       0        1       0 :                  762.59             : -1            
cdo    info: Processed 1 variable over 12 timesteps [0.00s 50MB].
    -1 :       Date     Time   Level Gridsize    Miss :     Minimum        Mean     Maximum : Parameter ID
     1 : 2000-01-16 00:00:00       0        1       0 :                  81.229             : -1            
     2 : 2000-02-15 00:00:00       0        1       0 :                  51.032             : -1            
     3 : 2000-03-16 00:00:00       0        1       0 :                  57.439             : -1            
     4 : 2000-04-16 00:00:00       0        1       0 :                  55.116             : -1            
     5 : 2000-05-16 00:00:00       0        1       0 :                  53.700             : -1            
     6 : 2000-06-16 00:00:00       0        1       0 :                  58.400             : -1            
     7 : 2000-07-16 00:00:00       0        1       0 :                  45.471             : -1            
     8 : 2000-08-16 00:00:00       0        1       0 :                  53.642             : -1            
     9 : 2000-09-16 00:00:00       0        1       0 :                  71.161             : -1            
    10 : 2000-10-16 00:00:00       0        1       0 :                  77.845             : -1            
    11 : 2000-11-16 00:00:00       0        1       0 :                  77.545             : -1            
    12 : 2000-12-16 00:00:00       0        1       0 :                  80.006             : -1            
cdo    info: Processed 1 variable over 12 timesteps [0.00s 51MB].

它看起来非常好,但它们与 https://climatecharts.net/ 1970-2000 年间使用 CRU ts4.04 的伦敦显示的结果不同。

我的问题是:我计算的是降水量的月平均值和年总和吗?

感谢您的帮助。

cdo 函数:

ymonmean 

计算每个日历月的平均值,即所有一月的平均值、所有二月的平均值等...生成的文件将有 12 个时间步长。

timcumsum

然后生成这 12 个步骤的累计和。所以第1步仍然是你的1月平均值,然后第2步有1月和2月平均值的总和等等,结果文件仍然有12个时间步长,你需要的结果应该是最后一步。

不过,如果你只是想知道平均年降雨量是多少,那么你可以直接用

计算
cdo yearsum in.nc out.nc  # calculate total for each year
cdo timmean out.nc year_average.nc # average over the totals

或使用一行管道:

cdo timmean -yearsum in.nc year_average.nc

以上警告,请确保您的系列有完整的日历年。如果第一年开始于例如7月,那么当年的总和显然只有6个月的降雨量,这会影响你的统计,最后一年的最后一个月也是如此。

最后,我在 climatecharts 的数据页面上看到它直接使用观测值而不是网格化的 cru,所以无论如何你不能期望结果完全相同。

编辑 2021:我现在制作了关于这些主题的视频指南:

Calculating temporal statistics

Calculating diurnal and seasonal cycles