共计 1321 个字符,预计需要花费 4 分钟才能阅读完成。
背景介绍
CMIP6(第六次国际耦合模式比较计划)是当前气候研究最重要的多模式数据集,但其原始输出分辨率各异(从 1°到 0.25°不等)。将数据统一到 0.5×0.5 度分辨率有三大优势:

- 满足多数区域气候研究的需求,平衡计算成本和空间细节
- 便于不同模式间比较分析
- 与常见观测数据集(如 CRU、GPCP)的分辨率对齐
工具链选型
- CDO(Climate Data Operators)
- 优势:命令行操作高效,内置丰富插值算法
-
劣势:调试不便,需额外学习语法
-
NCO(NetCDF Operators)
- 优势:擅长元数据维护
-
劣势:重采样功能较弱
-
xarray + scipy
- 优势:Python 生态无缝衔接,便于自定义流程
- 推荐组合:xarray==2023.7.0 + scipy==1.11.1
核心实现
数据准备
import xarray as xr
# 建议使用 dask 加速大数据读取
ds = xr.open_dataset('CMIP6_input.nc', chunks={'time': 12})
双线性插值法
from xesmf import Regridder
# 创建目标网格
target_grid = xr.Dataset({'lat': (['lat'], np.arange(-89.75, 90, 0.5)),
'lon': (['lon'], np.arange(-179.75, 180, 0.5))
})
regridder = Regridder(ds, target_grid, 'bilinear')
ds_regrid = regridder(ds)
保守插值法(适合降水等守恒量)
regridder_conserve = Regridder(ds, target_grid, 'conservative')
# 需要指定权重变量
precip_regrid = regridder_conserve(ds['pr'])
质量验证
-
空间分布对比
import matplotlib.pyplot as plt fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12,4)) ds['tas'].isel(time=0).plot(ax=ax1) ds_regrid['tas'].isel(time=0).plot(ax=ax2) -
统计量检查
print(f"原始数据均值: {ds['tas'].mean().values:.2f}") print(f"重采样后均值: {ds_regrid['tas'].mean().values:.2f}")
避坑指南
- 缺失值处理
- 重采样前先用
.where(ds['tas'] != 1e20)替换填充值 -
海洋模式数据需特殊处理陆地掩膜
-
内存优化
- 分块处理:
ds.chunk({'time': 1}) -
使用 zarr 格式替代 NetCDF
-
并行加速
from dask.distributed import Client client = Client(n_workers=4) # 启动本地集群
延伸思考
- 插值方法对极端温度指数的影响:
- 双线性法可能平滑极端值
-
最近邻法保持极值但可能产生锯齿
-
扩展到其他分辨率:
- 只需修改 target_grid 定义
- 高分辨率 (如 0.25°) 需注意计算资源
学习资源
正文完
