前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何将不同分辨率的ERA5数据插值为统一网格:CDO与xesmf方法

如何将不同分辨率的ERA5数据插值为统一网格:CDO与xesmf方法

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

如何将不同分辨率的ERA5数据插值为统一网格:CDO与xesmf方法

前言

当处理气象数据时,经常会遇到不同分辨率的数据集需要一起使用的情况。

小编在气象家园看到如下帖子:

下了两份ERA5资料,一份的分辨率是0.250.25,另一份地面气压分辨率是0.10.1,不同分辨率没办法一起计算,求助怎样转分辨率并输出文件?

本文将介绍两种方法来统一ERA5数据的分辨率:使用CDO命令行工具Python的xesmf库。

1. 创建样例数据

因为手头没有现成的数据,直接制造文件是比较快捷的

首先,我们使用xarray创建两个不同分辨率的样例数据集并保存为NetCDF文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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")

1.1 检查一下生成的文件

1.1.1 ncdump
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!ncdump -c /home/mw/project/era5_01deg.nc | head -20
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
netcdf era5_01deg {

dimensions:

	latitude = 1801 ;

	longitude = 3600 ;

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.9, -89.8, -89.7, -89.6, -89.5, -89.4, -89.3, -89.2, 

    -89.1000000000001, -89.0000000000001, -88.9000000000001, 

    -88.8000000000001, -88.7000000000001, -88.6000000000001, 

    -88.5000000000001, -88.4000000000001, -88.3000000000001, 

    -88.2000000000001, -88.1000000000001, -88.0000000000001, 

    -87.9000000000001, -87.8000000000001, -87.7000000000001, 

    -87.6000000000001, -87.5000000000001, -87.4000000000001, 
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!ncdump -c /home/mw/project/era5_025deg.nc | head -20
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
netcdf era5_025deg {

dimensions:

	latitude = 721 ;

	longitude = 1440 ;

variables:

	double temperature(latitude, longitude) ;

		temperature:_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, 
1.1.2 cdo查看文件信息

当然使用cdo查看网格会更简洁(大概)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!cdo griddes /home/mw/project/era5_01deg.nc
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#

# gridID 1

#

gridtype  = generic

gridsize  = 6483600

xsize     = 3600

ysize     = 1801

xname     = longitude

yname     = latitude

xfirst    = 0

xinc      = 0.1

yfirst    = -90

yinc      = 0.0999999999999943

[32mcdo    griddes: [0mProcessed 1 variable [0.08s 51MB]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!cdo griddes /home/mw/project/era5_025deg.nc
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#

# gridID 1

#

gridtype  = generic

gridsize  = 1038240

xsize     = 1440

ysize     = 721

xname     = longitude

yname     = latitude

xfirst    = 0

xinc      = 0.25

yfirst    = -90

yinc      = 0.25

[32mcdo    griddes: [0mProcessed 1 variable [0.05s 51MB]

2. 使用CDO进行插值

CDO (Climate Data Operators) 是我们的老朋友了,专门用于处理气候和NWP模型数据。对于nc数据可谓是瑞士军刀一般的存在

2.1 获取目标网格描述文件

首先,我们需要获取目标网格的描述文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!cdo griddes era5_025deg.nc > grid_025.txt
!cdo griddes era5_01deg.nc > grid_01.txt

这会生成一个描述0.25°网格的文本文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!cat /home/mw/project/grid_025.txt
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#

# gridID 1

#

gridtype  = generic

gridsize  = 1038240

xsize     = 1440

ysize     = 721

xname     = longitude

yname     = latitude

xfirst    = 0

xinc      = 0.25

yfirst    = -90

yinc      = 0.25

2.2 执行双线性插值

将0.1°分辨率的数据插值到0.25°分辨率:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!cdo remapbil,grid_025.txt era5_01deg.nc era5_01deg_regridded_to_025.nc
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[31m

cdo    remapbil (Abort): [0mUnsupported target grid type (generic)!

坏了,cdo不支持这个 grid type (generic)

那么只能手动修改了

2.3 手动修改nc数据坐标属性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!sed -i "s/generic/lonlat/g" /home/mw/project/grid_025.txt
!cat /home/mw/project/grid_025.txt
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#

# gridID 1

#

gridtype  = lonlat

gridsize  = 1038240

xsize     = 1440

ysize     = 721

xname     = longitude

yname     = latitude

xfirst    = 0

xinc      = 0.25

yfirst    = -90

yinc      = 0.25
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!sed -i "s/generic/lonlat/g" /home/mw/project/grid_01.txt
!cat /home/mw/project/grid_01.txt
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#

# gridID 1

#

gridtype  = lonlat

gridsize  = 6483600

xsize     = 3600

ysize     = 1801

xname     = longitude

yname     = latitude

xfirst    = 0

xinc      = 0.1

yfirst    = -90

yinc      = 0.0999999999999943
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!cdo setgrid,grid_025.txt era5_025deg.nc era5_025deg_002.nc
!cdo griddes /home/mw/project/era5_025deg_002.nc
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[32mcdo    setgrid: [0mProcessed 1038240 values from 1 variable over 1 timestep [0.13s 5096MB]
#
# gridID 1
#
gridtype  = lonlat
gridsize  = 1038240
xsize     = 1440
ysize     = 721
xname     = longitude
xlongname = "longitude"
xunits    = "degrees_east"
yname     = latitude
ylongname = "latitude"
yunits    = "degrees_north"
xfirst    = 0
xinc      = 0.25
yfirst    = -90
yinc      = 0.25
[32mcdo    griddes: [0mProcessed 1 variable [0.03s 5096MB]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!cdo setgrid,grid_01.txt era5_01deg.nc era5_01deg_002.nc
!cdo griddes /home/mw/project/era5_01deg_002.nc
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[32mcdo    setgrid: [0mProcessed 6483600 values from 1 variable over 1 timestep [0.37s 5096MB]
#
# gridID 1
#
gridtype  = lonlat
gridsize  = 6483600
xsize     = 3600
ysize     = 1801
xname     = longitude
xlongname = "longitude"
xunits    = "degrees_east"
yname     = latitude
ylongname = "latitude"
yunits    = "degrees_north"
xfirst    = 0
xinc      = 0.1
yfirst    = -90
yinc      = 0.0999999999999943
[32mcdo    griddes: [0mProcessed 1 variable [0.04s 5096MB]

2.4 一句插值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!cdo remapbil,grid_025.txt era5_01deg_002.nc era5_01deg_regridded_to_025.nc
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[32mcdo    remapbil: [0mBilinear weights from lonlat (3600x1801) to lonlat (1440x721) grid
cdo    remapbil:                        1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 91[32mcdo    remapbil: [0mProcessed 6483600 values from 1 variable over 1 timestep [0.92s 5096MB]

这个命令使用双线性插值法(remapbil)将输入文件(era5_01deg.nc)插值到grid_025.txt描述的网格上,并输出新文件。

文件生成并不符合cdo的格式,需要使用set指令调整一下。

插值速度是非常快的,按照官方说法可以达到c语言的程度,可以看到不到一秒就完成了

3. 使用Python的xesmf进行插值

xesmf是一个基于ESMF的Python库,专门用于地球科学数据的重网格化。

3.1 安装xesmf

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

3.2 执行重网格化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import xarray as xr
import xesmf as xe

# 加载数据
ds_target = xr.open_dataset("era5_025deg.nc")  # 目标网格
ds_source = xr.open_dataset("era5_01deg.nc")   # 源数据

# 创建重网格器
regridder = xe.Regridder(ds_source, ds_target, "bilinear")

# 执行重网格化
ds_regridded = regridder(ds_source)

# 保存结果
ds_regridded.to_netcdf("era5_01deg_regridded_to_025_xesmf.nc")
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!cdo griddes /home/mw/project/era5_01deg_regridded_to_025_xesmf.nc
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#

# gridID 1

#

gridtype  = generic

gridsize  = 1038240

xsize     = 1440

ysize     = 721

xname     = longitude

yname     = latitude

xfirst    = 0

xinc      = 0.25

yfirst    = -90

yinc      = 0.25

[32mcdo    griddes: [0mProcessed 1 variable [0.04s 5096MB]

方法比较

  1. CDO方法
    • 优点:命令行操作简单高效,适合批量处理,速度快
    • 缺点:需要学习CDO语法,调试不如Python方便
  2. xesmf方法
    • 优点:完全在Python环境中完成,易于集成到工作流中
    • 缺点:首次使用需要编译权重文件,可能稍慢

如果格式较为特殊,建议使用python更加便捷,虽然牺牲了处理速度

注意事项

  1. 插值方法选择:
    • 双线性插值(bilinear)适合连续场(如温度、气压)
    • 对于离散场(如土地利用),可能需要最近邻插值(nearest_s2d)
  2. 内存管理
    • 处理大文件时,xesmf可能需要分块处理
    • CDO通常内存效率更高
  3. 元数据保留:
    • 两种方法都可能需要手动处理变量属性和坐标信息

通过以上方法,你可以轻松地将不同分辨率的ERA5数据统一到相同网格上,便于后续的分析和计算。

参考

https://cloud.tencent.com/developer/ask/sof/1272125

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
【DevOps运维】构建面向应用的运维管理新思维
很多问题一直在困扰、在思考,为什么CMDB大部分项目都是失败的?为什么讨论的更多的是运维自动化而不是IT自动化?为什么线上问题永远是运维人的黑锅?带着这些问题我们来一探究竟。
用户1593318
2019/11/19
2.3K0
袋鼠云平台代码规范化编译部署的提效性改进实践
作为全链路数字化技术与服务提供商,袋鼠云提供了从数据湖、大数据基础平台、离线开发、实时开发、数据服务、数据治理、指标管理、客户数据洞察、数据孪生可视化等全产品体系的服务。
袋鼠云数栈
2022/11/07
5330
袋鼠云平台代码规范化编译部署的提效性改进实践
企业如何落地DevOps(下)
常用的版本和配置管理相关的工具,比如Ansible、Git、Apollo、CMDB等,都是被大家所熟知和广泛应用的工具,也是工程实践的一部分。工具和技术的选型根据各自的具体情况选择合适的即可,但其中有几点注意事项:
老_张
2023/08/09
2060
企业如何落地DevOps(下)
持续部署,并不简单!
这几年,持续集成随着敏捷在国内的推广而持续走热,与之相伴的持续部署也一直备受关注。自前两年,持续交付这个延续性概念又闯进了国内IT圈,慢慢开始在社区和会议中展露头角。许多不明真相的群众跟风哭着喊着要“上”,而许多前CI的半吊子玩家换件衣服就接着干,有的甚至衣服都来不及换......国内的这些土财主如果不巧请了某些所谓的战略家,除了建了一堆持续集成环境,以及每天嚷嚷着要这个要那个,混乱的状况在根本上没有得到改善。本文无意费力探讨持续集成和持续交付的概念,而是打算谈谈对于大型软件企业,以持续集成为基础实现持续部署(交付)时,所要面对的问题以及可行的解决方案。地主老财们,夜黑风正猛,山高路又远,注意脚下......
明哥的运维笔记
2019/01/30
5590
统一运维平台建设的一些思路和实践
企业构建一站式运维平台的目的是为了提升运维效率。那么一个成熟的运维系统应该要解决哪些问题呢?笔者认为首先是运维对象要被管理起来,然后是监控这些对象,接着是这些对象的自动化运维,最后是所有的运维操作都要有所规范。概括起来对应的系统就是CMDB、统一监控、自动化平台、ITSM,如下图所示。
用户1107783
2023/10/31
1.3K0
统一运维平台建设的一些思路和实践
运维平台规划体系全介绍
在之前的文章中,谈到过【运维的本质--可视化】,在可视化的篇幅中,着重介绍自动化的可视化和数据的可视化;在后续的篇章中又介绍了【互联网运维的价值体系】,里面分解了几个维度:质量、成本、效率、安全等。以上都是为了清楚的梳理运维的内容边界,基于这个边界,我们再考虑如何进行平台支撑。可以说前两篇文章都是为今天这篇文章作为铺垫,用理念先行,然后在考虑平台落地,最后在细化其中每个内容。我更习惯用如下的方式来整体表达运维的工作方法和思路;
用户1593318
2019/11/18
4.4K0
运维平台体系,你们真的有好好规划吗?
在之前的文章中,谈到过“运维的本质——可视化”,在可视化的篇幅中,着重介绍自动化的可视化和数据的可视化;在后续的篇章中又介绍了“互联网运维的价值体系”,里面分解了几个维度:质量、成本、效率、安全等。以上都是为了清楚地梳理运维的内容边界,基于这个边界,我们再考虑如何进行平台支撑。可以说前两篇文章都是为今天这篇文章作为铺垫,用理念先行,然后再考虑平台落地,最后再细化其中每个内容。我更习惯用如下的方式来整体表达运维的工作方法和思路:
小小科
2018/07/31
2.3K0
运维平台体系,你们真的有好好规划吗?
美国持续网络训练环境(PCTE)内容简报
美国陆军在2019年11月25号发布了最新的持续网络培训环境(PCTE)的项目CYBER TRIDENT(网络培训、就绪、集成、交付和企业技术)网络培训合同要求的最新信息。项目合同额度将近9.570亿美元。PCTE最主要的建设目标是为美国网络司令部网络任务部队提供一个云端的可以从世界任何地方登录以进行培训和演习任务的强大网络培训环境。
时间之外沉浮事
2020/01/02
2K0
柯基数据通过Rainbond完成云原生改造,实现离线持续交付客户
南京柯基数据科技有限公司成立于2015年,提供一站式全生命周期知识图谱构建和运维、智能应用服务,致力于“链接海量数据,从大数据中挖掘智慧“。帮助企业运用知识图谱技术打造世界领先的认知工作自动化智能引擎。
Rainbond开源
2021/09/03
6660
柯基数据通过Rainbond完成云原生改造,实现离线持续交付客户
【平台篇】可视化持续部署系统的设计与实现
持续部署(Continuous Deploy)的收益是全面的,体现在运维规范、自动化和团队合作等方面。
用户1593318
2019/11/19
1.9K0
【平台篇】可视化持续部署系统的设计与实现
01 . Zabbix简介原理及部署
1> 数据采集: 可用性和性能检测,自动发现,支持agent,snmp,JMX,telnet等多种采集方式,支持主动和被动数据传输、支持用户自定义插件,自定义间隔收集数据.
iginkgo18
2020/09/27
7280
01 . Zabbix简介原理及部署
企业级 Kubernetes 监控体系设计与实践
主要都是 kube-state-metrics 收集的, K8s 内置的资源对象 , 只需要添加启动参数即可
SRE运维进阶之路
2025/04/01
1690
企业级 Kubernetes 监控体系设计与实践
携程事件:运维债务的深度剖析与解决方案
********本文是BLUES【公众号ID:bluemidou】向老王约稿,特授权blues独家首发,现转载如此,哈哈********
用户1593318
2019/11/19
1.1K0
企业如何落地DevOps(上)
前面几篇文章,分别从devops的定义和价值、落地路线图以及落地三要素进行了分析。
老_张
2023/03/01
3140
企业如何落地DevOps(上)
柯基数据通过Rainbond完成云原生改造,实现离线持续交付客户
南京柯基数据科技有限公司成立于2015年,提供一站式全生命周期知识图谱构建和运维、智能应用服务,致力于“链接海量数据,从大数据中挖掘智慧“。帮助企业运用知识图谱技术打造世界领先的认知工作自动化智能引擎。
Rainbond开源
2021/09/10
5020
柯基数据通过Rainbond完成云原生改造,实现离线持续交付客户
DevOps 三步工作法之持续反馈的技术与案例
导言 很高兴参与DevOps时代社区的拆书联盟第一季活动,有幸能与几位DevOps大牛一起解读《DevOps Handbook》一书,这本书作者牛,内容也很牛,就连著名的培训机构把这本书作为DevOp
DevOps时代
2018/02/02
1.6K0
DevOps 三步工作法之持续反馈的技术与案例
使用Rainbond实现离线环境软件交付
在传统行业,如政府、能源、军工、公安、工业、交通等行业,为了防止数据泄露和运行安全考虑,一般情况下网络会采取内外网隔离的策略,以防范不必要的风险,毕竟在安全防护方面,网络物理隔离是网络安全防御最有效的手段,而网络隔离在软件交付过程中,对于外部软件开发厂商来说将会带来一系列的交付难题,也增加大量成本投入。例如:
Rainbond开源
2021/11/18
9780
使用Rainbond实现离线环境软件交付
系统架构 | 基于微服务架构,改造企业核心系统之实践
背景与挑战 随着公司国际化战略的推行以及本土业务的高速发展,后台支撑系统已经不堪重负。 在吞吐量、稳定性以及可扩展性上都无法满足日益增长的业务需求。对于每10万元额度的合同,从销售团队准备材料、与客户签单、递交给合同部门,再到合同生效大概需要3.5人天。随着业务量的快速增长,签订合同的成本急剧增加。 合同管理系统是后台支撑系统中重要的一部分。当前的合同系统是5年前使用.NET,基于SAGE CRM(http://www.sagecrm.com/)二次开发的产品。一方面,系统架构过于陈旧,性能、可靠性无法满足
张逸
2018/03/07
1.8K0
系统架构 | 基于微服务架构,改造企业核心系统之实践
深度解析:持续交付将如何拯救IT运维?
作者简介 刘劲辉(微信号:akito_hui),前阿里移动事业群高级运维工程师,现优维科技运维与平台研发专家,专注于DevOps、应用运维和平台架构设计,参与实施监控平台设计、运维规范设计、虚拟化应用、效率提升等相关工作,在若干大中型项目的建设和运维中,积累了丰富的系统运维、架构设计、项目实施经验。 前言 在深入探讨持续交付之前,我们先来看一个典型的场景: A 公司最近很苦恼。 A 是一个传统行业的公司,物流运输为主营业务,IT部门作为支撑部门辅助业务发展。但是随着业务的快速发展,IT 部门开始感觉到有点力
数据和云
2018/03/06
2.1K0
深度解析:持续交付将如何拯救IT运维?
运维的本质---可视化
没有比“可视化”更好的一个词能概括运维的本质,而“可视化”又应该分成两部分:可视化的服务交付和可视化的服务度量!
用户1593318
2019/11/18
1.4K0
推荐阅读
相关推荐
【DevOps运维】构建面向应用的运维管理新思维
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 如何将不同分辨率的ERA5数据插值为统一网格:CDO与xesmf方法
    • 前言
      • 1.1 检查一下生成的文件
    • 2. 使用CDO进行插值
      • 2.1 获取目标网格描述文件
      • 2.2 执行双线性插值
      • 2.3 手动修改nc数据坐标属性
      • 2.4 一句插值
    • 3. 使用Python的xesmf进行插值
      • 3.1 安装xesmf
      • 3.2 执行重网格化
    • 方法比较
    • 注意事项
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档