NetCDF:如何屏蔽/过滤掉全局数据集中的非陆地值,最好是使用Python和/或NCO?

Jam*_*ams 2 scipy netcdf nco netcdf4 cdo-climate

我有一个0.25度分辨率的全局数据,我想掩盖,以便它只包含陆地上的数据值.

数据涵盖了lon维度的全360度和纬度维度的-60到60度.

下面列出了文件头以及摘要lat和lon坐标值:

netcdf cmorph_global_daily {
dimensions:
    lat = UNLIMITED ; // (480 currently)
    lon = 1440 ;
    time = 7305 ;
variables:
    float lat(lat) ;
        lat:units = "degrees_north" ;
        lat:long_name = "Latitude" ;
    float lon(lon) ;
        lon:units = "degrees_east" ;
        lon:long_name = "Longitude" ;
    float prcp(lat, lon, time) ;
        prcp:_FillValue = NaNf ;
        prcp:units = "mm" ;
        prcp:standard_name = "precipitation" ;
        prcp:long_name = "Precipitation" ;
        prcp:description = "CMORPH Version 1.0BETA Version, daily precip from 00Z-24Z" ;
    int time(time) ;
        time:units = "days since 1900-01-01" ;
        time:long_name = "Time" ;
        time:calendar = "gregorian" ;

// global attributes:
        :history = "Mon Mar 26 10:44:42 2018: ncpdq -a lat,lon,time cmorph_adjusted_daily.nc latlontime/cmorph_adjusted_daily.nc\nThu Mar 15 10:21:10 2018: ncks -4 cmorph_adjusted_daily.nc cmorph_adjusted_daily.nc" ;
        :nco_openmp_thread_number = 1 ;
        :title = "CMORPH Version 1.0BETA Version, daily precip from 00Z-24Z" ;
        :NCO = "4.7.2" ;
data:

 lat = -59.875, -59.625, -59.375, -59.125, ..., 59.125, 59.375, 59.625, 59.875 ;
 lon = 0.125, 0.375, 0.625, 0.875, 1.125, ..., 359.125, 359.375, 359.625, 359.875 ;
Run Code Online (Sandbox Code Playgroud)

我更喜欢使用Python/numpy和/或NCO,因为这是我的典型工具集.在此先感谢您的任何建议.

Cha*_*der 5

一旦你在同一网格的变量与掩盖,你可以使用ncap2 其中,例如,

ncap2 -s 'where(LANDMASK != 1) prcp=prcp@_FillValue' in.nc out.nc
Run Code Online (Sandbox Code Playgroud)

如果您的掩码位于与数据不同的网格上,则可以使用(在Linux/Mac上)ncremap的掩蔽功能,例如,将数据重新映射到掩码(反之亦然),例如

ncremap --msk_dst=LANDMASK -d mask.nc prcp_in.nc prcp_out.nc
Run Code Online (Sandbox Code Playgroud)