对比不同分辨率的网格数据时,通常需要将数据插值到相同网格。有很多工具可以实现此功能,本文主要讲一下如何利用xesmf对网格数据进行regrid。
工具安装就不说了,首先导入所需要的库:
import xarray as xr import xesmf as xe import numpy as np
然后获取CMIP5的月表面温度数据:
url = 'http://dapds00.nci.org.au/thredds/dodsC/rr3/CMIP5/output1/CSIRO-BOM/ACCESS1-3/historical/mon/atmos/Amon/r1i1p1/latest/tas/tas_Amon_ACCESS1-3_historical_r1i1p1_185001-200512.nc' ds = xr.open_dataset(url)
执行如下语句可以得到原始数据的经纬度网格分辨率:
(ds['lat'].max() - ds['lat'].min())/(ds['lat'].count()-1.) (ds['lon'].max() - ds['lon'].min())/(ds['lon'].count()-1.)
原始的数据分辨率为 1.25 x 1.875 度,然后将网格插值为2.5x2.5度。可以直接利用 xesmf 的相关函数生成网格:
ds_out = xe.util.grid_2d(-180.0, 180.0, 2.5, -90.0, 90.0, 2.5)
下一步创建 regridder,默认情况下不会保存所使用的权重信息。注意:由于这里所使用的是全球数据,periodic=True是为了保证在沿着中心经度时不会出现空白间隙。
regridder = xe.Regridder(ds, ds_out, 'bilinear', periodic=True)
下一步就是进行插值操作了:
tas_25deg = regridder(ds['tas'])
可以绘图对比一下结果:
ds['tas'].isel(time=0).plot() tas_25deg.isel(time=0).plot()
插值前后温度分布
如果需要频繁的对相同网格分辨率的数据进行插值,可以重复利用权重信息以节省时间。通过指定文件名保存权重信息:
regridder_save_weights = xe.Regridder(ds,ds_out,'bilinear',periodic=True,filename='bilinear_145x192_180x360_peri.nc')
然后使用保存的权重信息构建 regridder:
regridder_reuse_weights = xe.Regridder(ds,ds_out,'bilinear',periodic=True,reuse_weights=True,filename='bilinear_145x192_180x360_peri.nc')
xesmf支持多种投影方式的网格插值操作,详细信息可以前往官方文档查看。