Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >网格重采样工具对决:xarray-regrid  vs xemsf

网格重采样工具对决:xarray-regrid  vs xemsf

作者头像
用户11172986
发布于 2025-06-19 05:06:15
发布于 2025-06-19 05:06:15
13000
代码可运行
举报
文章被收录于专栏:气python风雨气python风雨
运行总次数:0
代码可运行

网格重采样工具终极对决:xarray-regrid  vs xemsf

项目概述

所谓文无第一,武无第二

气象领域的插值方案是江山辈有才人出,那么我们今天来看看新鲜的插值库xarray-regrid

xarray-regrid 使用 regridding 方法扩展了 xarray,使其能够轻松有效地在两个直线网格之间重新网格化。

其支持以下插值方法

Linear

Nearest-neighbor

Conservative

Cubic

Zonal statistics

“Most common value” (zonal statistics)

“Least common value” (zonal statistics)

个人信息

公众号:气python风雨

Image Name

关注我获取更多学习资料,第一时间收到我的Python学习资料,也可获取我的联系方式沟通合作

环境设置

安装依赖

安装非常简单,只需要pip,注意需要python版本大于3.10

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!pip install xarray-regrid -i https://pypi.mirrors.ustc.edu.cn/simple/

示例数据

示例数据使用常见的era5的nc格式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import xarray as xr 
ds = xr.open_dataset("/home/mw/input/era5sample8008/era5.nc") 
ds

1. xarray-regrid 实现方案

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import xarray_regrid  
import xarray as xr  
from xarray_regrid import Grid  
from time import time  

# 创建目标网格(45°N-90°N, 90°E-180°E, 0.17°分辨率)  
new_grid = Grid(  
    north=,       # 北边界  
    south=,       # 南边界  
    west=,        # 西边界  
    east=,       # 东边界  
    resolution_lat=0.17,  # 纬度分辨率  
    resolution_lon=0.17   # 经度分辨率  
)  
target_ds = new_grid.create_regridding_dataset()  

# 加载ERA5数据  
ds = xr.open_dataset("/home/mw/input/era5sample8008/era5.nc")  

# 执行双线性重采样(核心代码)  
t_start = time()  
regridded_ds = ds.regrid.linear(target_ds)  # 线性插值  
regridded_ds = regridded_ds.compute()  # 触发实际计算  
print(f"xarray-regrid耗时: {time()-t_start:.2f}秒")  

# 结果验证  
print("重采样结果统计:")  
print(f"最小值: {regridded_ds['u10'].min().values:.2f}m/s")  
print(f"最大值: {regridded_ds['u10'].max().values:.2f}m/s")  
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xarray-regrid耗时: 5.99重采样结果统计:
最小值: -18.50m/s
最大值: 22.56m/s
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ds['u10'][].plot()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<matplotlib.collections.QuadMesh at 0x7fb0fd608b90>
图片
图片
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
regridded_ds['u10'][].plot()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<matplotlib.collections.QuadMesh at 0x7fb0fd6cf250>
图片
图片

2. cdo插值

具体操作过程这里

https://www.heywhale.com/mw/project/681ccb6c446db0038d3a6502

cdo更适合写为shell脚本使用,在notebook中不方便

3. xESMF 实现方案(ESMF封装)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

import xarray as xr  
import xesmf as xe  
from time import time  
import numpy as np  

# 加载数据  
ds = xr.open_dataset("/home/mw/input/era5sample8008/era5.nc")  

# 创建目标网格(需手动构建)  
target_ds = xr.Dataset({  
    'lat': (['lat'], np.arange(, , 0.17)),  # 纬度坐标  
    'lon': (['lon'], np.arange(, , 0.17))  # 经度坐标  
})  

# 步骤1:创建重采样器(耗时最长)  
t_start = time()  
regridder = xe.Regridder(  
    ds,          # 输入数据集  
    target_ds,   # 目标网格  
    'bilinear',  # 双线性方法  
    extrap_method='nearest_s2d'# 边界外推方法  
)  
print(f"xESMF初始化耗时: {time()-t_start:.2f}秒")  

# 步骤2:执行重采样  
t_start = time()  
regridded_ds_emsf = regridder(  
    ds,             # 输入数据  
    keep_attrs=True# 保留属性  
)  
print(f"xESMF重采样耗时: {time()-t_start:.2f}秒")  
# 结果后处理  
regridded_ds_emsf = regridded_ds_emsf.rename({'lat': 'latitude', 'lon': 'longitude'})  

# 结果验证  
print("重采样结果统计:")  
print(f"最小值: {regridded_ds_emsf['u10'].min().values:.2f}m/s")  
print(f"最大值: {regridded_ds_emsf['u10'].max().values:.2f}m/s")  

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xESMF初始化耗时: 13.47xESMF重采样耗时: 5.09重采样结果统计:
最小值: -18.50m/s
最大值: 22.56m/s
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
regridded_ds_emsf['u10'][].plot()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<matplotlib.collections.QuadMesh at 0x7fb0fd43ca10>
图片
图片
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(regridded_ds_emsf['u10'][]-regridded_ds['u10'][]).max()
图片
图片

插值结果一致

🧩 关键差异对比表

功能

xarray-regrid

CDO

xESMF

代码量

10行

需多步脚本

15行

预处理

无需

需转64位浮点

需手动建网格

边界处理

自动外推

需单独配置

需指定参数

内存管理

支持Dask流式

全加载

全加载

并行能力

原生Dask支持

需OpenMP编译

单线程

坐标系支持

自动识别

需明确定义

需明确定义

结论

三种方法各有适用场景,但xarray-regrid主打简洁,易上手,且支持dask。对于数据结构简单的大量数据还是挺方便的。

不过在对于多个高度层的数据还没摸索出比较合适的插值方法,容易爆内存

对于结构复杂的nc文件,例如wrf这种不标准的网格,xesmf即可发挥作用 ,其在有权重文件存在下插值速度也是非常快的

而cdo则是在命令行下的快速实现为主,需要操作者对指令与参数比较熟悉

当然最主要的还是我们自身需要了解数据本身的结构才能更好地操作这些工具

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-06-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 气python风雨 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
关于WRF插值站点的二三事
很多时候我们需要拿模拟数据和站点图作对比,那就需要把模拟数据插值到站点 今天来尝试两种WRF数据插值到站点的方法并使用meteva进行简单绘图 方法一:xesmf库重插值后使用meteva进行双线性插值到站点 方法二:proj+scipy重插值后使用meteva进行最临近插值到站点
用户11172986
2024/06/20
3460
关于WRF插值站点的二三事
续篇:ERA5数据插值方法详解 - xarray interp与interp_like
在上一篇文章中,我们介绍了使用CDO和xesmf进行ERA5数据插值的方法。本文将扩展介绍另外两种实用的插值方案:xarray自带的interp功能和interp_like函数,帮助大家在不同场景下选择最适合的工具。
用户11172986
2025/05/12
2171
续篇:ERA5数据插值方法详解 - xarray interp与interp_like
利用xesmf对网格数据进行regrid
对比不同分辨率的网格数据时,通常需要将数据插值到相同网格。有很多工具可以实现此功能,本文主要讲一下如何利用xesmf对网格数据进行regrid。
bugsuse
2022/09/23
2.2K0
利用xesmf对网格数据进行regrid
如何将不同分辨率的ERA5数据插值为统一网格:CDO与xesmf方法
下了两份ERA5资料,一份的分辨率是0.250.25,另一份地面气压分辨率是0.10.1,不同分辨率没办法一起计算,求助怎样转分辨率并输出文件?
用户11172986
2025/05/10
3420
如何将不同分辨率的ERA5数据插值为统一网格:CDO与xesmf方法
代码实战 | 基于 global-land-mask 的陆地掩膜气象可视化
由于可视化代码过长隐藏,可点击运行Fork查看 若没有成功加载可视化图,点击运行可以查看 ps:隐藏代码在【代码已被隐藏】所在行,点击所在行,可以看到该行的最右角,会出现个三角形,点击查看即可
用户11172986
2025/01/11
2490
代码实战 | 基于 global-land-mask 的陆地掩膜气象可视化
xarray系列|WRF模式前处理和后处理
距离上次xarray的更新已经过去两个多星期了...,关于xarray插值方法的介绍官方文档已经给的比较详细了,也有公众号推送过相关文章 xarray指南:插值 基于xarray的气象场站点和格点插值,所以xarray的插值部分就不单独说了。
郭好奇同学
2021/08/26
5.6K0
xarray系列|WRF模式前处理和后处理
meteva,这可能是气象萌新最需要的python库
本文内容参考meteva官方文档: https://www.showdoc.com.cn/meteva/ 面向群体:拿着micaps数据却不知如何读取与绘图的小白 初衷:向广大气象学子介绍meteva库的用途,达到降低micaps门槛的目的,主打“我淋过雨我撑伞” 应用场景:比如说组会前赶图(
用户11172986
2024/06/20
2.4K0
meteva,这可能是气象萌新最需要的python库
xarray 系列 | 怎么使用ERA5再分析数据绘制气象要素廓线
前段时间有读者来信问再分析数据的气象要素廓线怎么绘制,近期小编可以腾出手做个简单示例
用户11172986
2024/06/20
7570
xarray 系列 | 怎么使用ERA5再分析数据绘制气象要素廓线
WRF如何转换投影+模拟台风路径可视化
'linear':线性插值是一种基于线性关系进行插值的方法。它假设数据点之间的变化是线性的,并在相邻数据点之间进行插值。
用户11172986
2024/06/20
3710
WRF如何转换投影+模拟台风路径可视化
气象常用库 | xarray入门用法总结
5.使用给出的index,columns分别设定为lat,lon的DataFrame,创建一个DataArray
自学气象人
2022/11/14
3.8K0
xarray基础之计算篇
在东经126,北纬9的附近的小黑点就是最大值所在,格点数据放大看确实有点奇形怪状 还有对应的argmin,用法差不多就不多介绍了
用户11172986
2024/06/20
2080
xarray基础之计算篇
xarray实操 | 基于ERA5 GRIB数据的气象要素廓线
由于可视化代码过长隐藏,可点击运行Fork查看 🔜🔜若没有成功加载可视化图,点击运行可以查看 ps:隐藏代码在【代码已被隐藏】所在行,点击所在行,可以看到该行的最右角,会出现个三角形,点击查看即可
用户11172986
2024/06/20
5920
xarray实操 | 基于ERA5 GRIB数据的气象要素廓线
数据处理 | xarray的计算距平、重采样、时间窗
现代气候学认为在相当长的时间段(一般认为是 30 年)中,变量多年平均是一个稳定的值。因此在一个时间段中,如果能够充分认识变量随平均状态的变化趋势,那么对于预测未来情况是非常有利的。那么这个所谓随着平均态的偏移值便可称为距平(异常,anomaly).
郭好奇同学
2021/05/28
12K1
数据处理 | xarray的计算距平、重采样、时间窗
从xarray走向netCDF处理(三):插值与掩膜
对于xarray之前已经介绍过两期了,分别是数据结构及数据读取和数据索引。 这一期要介绍的功能是插值与掩膜。 这两个方法在数据处理中会经常用到,实用等级☆☆☆☆☆。
MeteoAI
2019/07/24
8.9K4
Python气象数据处理与可视化
在当今数据驱动的时代,气象数据的获取、处理和可视化已成为气象科学研究和业务应用中不可或缺的环节。Python作为一种功能强大且灵活的编程语言,已经在气象数据处理和可视化领域展现出了巨大的潜力。它不仅提供了丰富的库和工具,如`matplotlib`和`cartopy`,用于数据的科学绘图与可视化,还支持多种数据格式的处理,如`NetCDF`、`GRIB`、`HDF`。此外,Python还能够高效地下载和预处理气象数据,例如利用`cdsapi`和`IDM`批量下载`ERA5`数据。
阿巴阿巴-
2025/03/10
6750
ERA5水汽通量散度剖面计算与绘图
由于可视化代码过长隐藏,可点击运行Fork查看 若没有成功加载可视化图,点击运行可以查看 ps:隐藏代码在【代码已被隐藏】所在行,点击所在行,可以看到该行的最右角,会出现个三角形,点击查看即可
用户11172986
2025/01/14
5741
ERA5水汽通量散度剖面计算与绘图
代码实战 | 如何使用地形数据去除ERA5低层虚假数据
在气象学和气候研究中,理解不同高度层的温度变化对于准确预测天气模式和气候变化至关重要。特别是850 hPa这一高度层,它位于对流层下部,是监测天气系统发展的重要层次之一。然而,在某些地区,尤其是地形复杂的区域,如山脉或高原附近,ERA5再分析数据可能会因为模型分辨率限制而产生虚假的850 hPa数据——这些地方实际上可能是地形表面而非自由大气。
用户11172986
2025/01/09
2730
代码实战 | 如何使用地形数据去除ERA5低层虚假数据
json格式的气象数据转成指定的nc格式
自学气象人
2023/06/20
5700
json格式的气象数据转成指定的nc格式
绘图精进 | ERA5 弯曲箭头风场图绘制
弯曲箭头从前是NCL语言独有的绘制方法,在2019后它不再维护,NOAA转身投入了PYTHON的怀抱
用户11172986
2025/01/13
4870
绘图精进 | ERA5 弯曲箭头风场图绘制
用Python复现一篇Nature的研究: 1.数据下载及预处理
本篇文章将从数据下载、处理、神经网络训练、画图四个大步骤叙说笔者在复现 Deep learning for multi-year ENSO forecasts这篇文章的工作。所涉及Python库有 wget , matplotlib , numpy ,xarray , pytorch 等一系列在深度学习以及气象数据处理中经常使用的函数库,希望这篇文章能够对大家有所帮助。笔者也只是大学二年级的本科生,做这些东西也只是凭借个人兴趣,水平低下、错误频出也是常有的事情,请大家见谅。
气象学家
2021/07/30
2.5K1
推荐阅读
相关推荐
关于WRF插值站点的二三事
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验