上期有朋友在评论区询问有无更简单的插值方法,上次说的库很难安装
在上一篇文章中,我们介绍了使用CDO和xesmf进行ERA5数据插值的方法。本文将扩展介绍另外两种实用的插值方案:xarray自带的interp功能和interp_like函数,帮助大家在不同场景下选择最适合的工具。
关注我获取更多学习资料,第一时间收到我的Python学习资料,也可获取我的联系方式沟通合作
import xarray as xr
import numpy as np
# 创建0.25°分辨率的样例数据
lat_025 = np.arange(-90, 90.25, 0.25)
lon_025 = np.arange(0, 360, 0.25)
data_025 = np.random.rand(len(lat_025), len(lon_025))
ds_025 = xr.Dataset(
{"temperature": (["latitude", "longitude"], data_025)},
coords={
"latitude": lat_025,
"longitude": lon_025,
},
)
ds_025.to_netcdf("era5_025deg.nc")
# 创建0.1°分辨率的样例数据
lat_01 = np.arange(-90, 90.1, 0.1)
lon_01 = np.arange(0, 360, 0.1)
data_01 = np.random.rand(len(lat_01), len(lon_01))
ds_01 = xr.Dataset(
{"surface_pressure": (["latitude", "longitude"], data_01)},
coords={
"latitude": lat_01,
"longitude": lon_01,
},
)
ds_01.to_netcdf("era5_01deg.nc")
xarray库内置的interp方法提供了一种简单直观的插值方式,特别适合在Python工作流中快速实现数据对齐。
import xarray as xr
# 加载数据
ds_highres = xr.open_dataset('era5_01deg.nc') # 高分辨率数据(0.1°)
ds_target = xr.open_dataset('era5_025deg.nc') # 目标网格(0.25°)
# 使用线性插值
ds_interp = ds_highres.interp(
latitude=ds_target.latitude,
longitude=ds_target.longitude,
method='linear'
)
# 保存结果
ds_interp.to_netcdf('era5_interp_xarray.nc')
!ncdump -c /home/mw/project/era5_interp_xarray.nc | head -20
netcdf era5_interp_xarray {
dimensions:
latitude = 721 ;
longitude = 1440 ;
variables:
double surface_pressure(latitude, longitude) ;
surface_pressure:_FillValue = NaN ;
double latitude(latitude) ;
latitude:_FillValue = NaN ;
double longitude(longitude) ;
longitude:_FillValue = NaN ;
data:
latitude = -90, -89.75, -89.5, -89.25, -89, -88.75, -88.5, -88.25, -88,
-87.75, -87.5, -87.25, -87, -86.75, -86.5, -86.25, -86, -85.75, -85.5,
-85.25, -85, -84.75, -84.5, -84.25, -84, -83.75, -83.5, -83.25, -83,
-82.75, -82.5, -82.25, -82, -81.75, -81.5, -81.25, -81, -80.75, -80.5,
-80.25, -80, -79.75, -79.5, -79.25, -79, -78.75, -78.5, -78.25, -78,
-77.75, -77.5, -77.25, -77, -76.75, -76.5, -76.25, -76, -75.75, -75.5,
-75.25, -75, -74.75, -74.5, -74.25, -74, -73.75, -73.5, -73.25, -73,
xarray的interp提供了多种插值方法:
linear
: 双线性插值(默认)nearest
: 最近邻插值zero
: 零阶样条slinear
: 一阶样条quadratic
: 二阶样条cubic
: 三阶样条对于内存不足的情况,可以使用分块处理:
# 启用分块处理
ds_highres.chunk({'latitude': 100, 'longitude': 100}).interp(
latitude=ds_target.latitude,
longitude=ds_target.longitude
)
2. interp_like方法 当需要更灵活的插值控制时,可以使用interp_like方法 2.1 基本实现 ds_source.interp_like(ds_target, method='linear') 2.2 插值 import xarray as xr # 加载不同分辨率的数据集 ds_01deg = xr.open_dataset('era5_01deg.nc') # 0.1度分辨率 ds_025deg = xr.open_dataset('era5_025deg.nc') # 0.25度分辨率 # 使用interp_like进行插值 ds_regridded = ds_01deg.interp_like(ds_025deg) # 保存结果 ds_regridded.to_netcdf('era5_01deg_to_025deg_interp_like.nc') !ncdump -c /home/mw/project/era5_01deg_to_025deg_interp_like.nc | head -20 netcdf era5_01deg_to_025deg_interp_like { dimensions: latitude = 721 ; longitude = 1440 ; variables: double surface_pressure(latitude, longitude) ; surface_pressure:_FillValue = NaN ; double latitude(latitude) ; latitude:_FillValue = NaN ; double longitude(longitude) ; longitude:_FillValue = NaN ; data: latitude = -90, -89.75, -89.5, -89.25, -89, -88.75, -88.5, -88.25, -88, -87.75, -87.5, -87.25, -87, -86.75, -86.5, -86.25, -86, -85.75, -85.5, -85.25, -85, -84.75, -84.5, -84.25, -84, -83.75, -83.5, -83.25, -83, -82.75, -82.5, -82.25, -82, -81.75, -81.5, -81.25, -81, -80.75, -80.5, -80.25, -80, -79.75, -79.5, -79.25, -79, -78.75, -78.5, -78.25, -78, -77.75, -77.5, -77.25, -77, -76.75, -76.5, -76.25, -76, -75.75, -75.5, -75.25, -75, -74.75, -74.5, -74.25, -74, -73.75, -73.5, -73.25, -73, 3. 方法比较与选择指南 方法优点缺点适用场景CDO处理速度快,内存效率高需要命令行操作,调试不便批量处理大量数据xesmf基于ESMF,专业级插值初次使用需编译权重文件需要高质量保守插值xarray interp集成在xarray中,使用简单大文件内存消耗大快速原型开发和小数据集interp_like集成在xarray中,使用简单,适合格点变量同种的数据使用范围较小同类数据 4. 总结 前后介绍了四种主要的ERA5数据插值方法: 选择哪种方法取决于您的具体需求: 希望本文能帮助您更好地处理ERA5和其他气象数据集的多分辨率问题。 CDO:命令行高效工具 xesmf:专业级重网格化 xarray interp:简单易用的Python方案 interp_like:简单的更进一步
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有