当前位置: 首页 > news >正文

从 Google Cloud Storage 获取 ERA5 数据并转换为 Zarr 格式

背景与目标

ERA5 是由 ECMWF 提供的全球气象再分析数据集,包含了丰富的气象变量,广泛应用于气候研究、数值模拟和机器学习。由于数据量非常庞大,直接下载和处理往往效率低下。

Google Cloud Storage (GCS) 提供了 ERA5 的公开数据集,用户可以直接在线读取,而无需提前下载整包数据。为了在本地进行高效分析,我们通常会将这些数据转换为Zarr 格式。Zarr 支持分块存储和并行访问,能够显著提升数据处理效率,并且方便断点续传和大规模计算。

本文的目标是展示如何通过 Python 脚本从 GCS 获取 ERA5 数据,并将其转换为本地 Zarr 文件,为后续科研和工程应用打下基础。

环境准备

在开始之前,需要准备好以下环境和工具:

  • Python 环境:推荐 3.9+

  • 依赖库安装

    pip install pandas xarray gcsfs numpy psutil rich

    其中:

  • xarray用于处理 NetCDF/Zarr 格式的多维数据。

  • gcsfs用于连接和读取 Google Cloud Storage 上的文件。

  • rich用于在终端显示动态进度表格。

  • psutil用于 CPU 绑定和系统资源管理。

  • 本地缓存目录:脚本中使用了D:\era5_tmpD:\era5_block_cache来存放临时文件和缓存数据,你可以根据自己的硬盘情况修改路径。

配置GCS访问权限

ERA5 数据集在 Google Cloud Storage 上是公开的,因此我们可以直接使用匿名访问模式读取数据,无需额外的认证配置:

import gcsfs fs = gcsfs.GCSFileSystem(token="anon")

如果你需要访问的是私有数据集,那么就需要额外配置权限。常见的方式包括:

  • 使用服务账号密钥文件,并在代码中指定路径。

  • 设置环境变量(如GOOGLE_APPLICATION_CREDENTIALS),让程序自动读取认证信息。

  • 通过Google Cloud SDK登录并授权。

在本文的示例中,我们主要使用匿名访问模式来读取 ERA5 的公开数据集,这样可以直接运行脚本而不必额外配置权限。

从GCS读取数据

在脚本中,我们使用gcsfs来连接 Google Cloud Storage,并通过xarray打开 ERA5 的 NetCDF 文件。这样可以直接在云端读取数据,而无需提前下载整包。

最简单的示例代码如下:

import gcsfs, xarray as xr fs = gcsfs.GCSFileSystem(token="anon") with fs.open("gcp-public-data-arco-era5/raw/date-variable-pressure_level/2001/11/07/temperature/500.nc") as f: ds = xr.open_dataset(f) print(ds)

说明:

  • gcsfs.GCSFileSystem(token="anon"):使用匿名模式连接到 Google Cloud Storage 的公开数据集。

  • fs.open(...):指定 ERA5 数据集中的某一天、某个变量(这里是温度)和某个气压层(500hPa)。

  • xarray.open_dataset(f):用xarray打开 NetCDF 文件,得到一个多维数据集对象。

  • print(ds):打印数据集的基本信息,包括维度(time、latitude、longitude 等)和变量。

这个示例展示了最基本的读取流程。在完整脚本中,会自动遍历日期范围、多个变量和压力层,并裁剪到指定的经纬度区域,从而批量获取 ERA5 数据。

转换为Zarr格式

从 GCS 读取到的 ERA5 数据可以直接保存为 Zarr 文件。Zarr 格式支持分块存储和并行访问,非常适合大规模科学计算。最简单的写法如下:

# 将数据集保存为本地 Zarr 文件 ds.to_zarr("local_output.zarr", mode="w", consolidated=False)

说明:

  • to_zarr():将xarray.Dataset转换为 Zarr 格式。

  • mode="w":表示写入新文件,如果已有文件会覆盖。

  • consolidated=False:关闭索引合并,适合逐步追加数据。

在完整脚本中,保存过程更进一步:

  • 每个进程会先将数据写入一个临时 Zarr 文件(例如D:\era5_tmp\part_xxxx.zarr)。

  • 主进程再调用merge_one()将临时文件合并到主 Zarr 文件。

  • 这种方式避免了单次写入过大或进程间冲突,同时支持断点续传

这种“临时写入 + 合并”的策略在处理 ERA5 这种大规模数据时非常实用,可以显著提升稳定性和效率。

验证与优化

在数据转换为 Zarr 格式后,建议进行验证和优化,以确保文件完整性和存储效率。

验证完整性:可以使用xarray.open_zarr()打开生成的 Zarr 文件,检查维度和变量是否正确:

import xarray as xr ds = xr.open_zarr("local_output.zarr", consolidated=False) print(ds)

如果能正常打印出数据集结构,说明文件写入成功。若出现错误,脚本会自动删除损坏的文件并重新生成。

优化存储效率:

  • 调整分块大小:Zarr 支持分块存储,可以根据数据访问模式选择合适的块大小。例如,按时间维度分块有利于逐日读取。

  • 压缩算法:可以通过encoding参数设置压缩方式(如zlibblosc),在保证读取速度的同时减少存储空间。

  • 并行进程数:脚本中的MAX_WORKERS控制并行下载数量,过高可能导致内存不足,过低则影响效率。

  • 批次大小BATCH_SIZE决定每次处理的天数,可以根据网络和硬盘性能调整。

通过这些方法,可以在保证数据完整性的同时,进一步提升存储和读取效率。

代码示例
import gcsfs, xarray as xr, pandas as pd, numpy as np, os, shutil # 基础路径:ERA5 数据在 GCS 上的公开存储位置 BASE_PATH = "gcp-public-data-arco-era5/raw/date-variable-pressure_level" # 本地 Zarr 文件保存路径 ZARR_PATH = r"E:\era5_data.zarr" # 读取一天的数据并保存为临时 Zarr 文件 def read_one_day(d): # 使用匿名模式连接 GCS(公开数据无需认证) fs = gcsfs.GCSFileSystem(token="anon") # 构造指定日期的文件路径,这里以温度 500hPa 为例 path = f"{BASE_PATH}/{d:%Y/%m/%d}/temperature/500.nc" # 打开并读取 NetCDF 文件 with fs.open(path, "rb") as f: ds = xr.open_dataset(f) # 保存为临时 Zarr 文件(避免直接写入主文件) tmp_path = f"D:\\era5_tmp\\part_{d:%Y%m%d}.zarr" ds.to_zarr(tmp_path, mode="w") return tmp_path # 将临时 Zarr 文件合并到主 Zarr 文件 def merge_one(path): ds = xr.open_zarr(path) if os.path.exists(ZARR_PATH): # 如果主文件已存在,则追加写入(按时间维度) ds.to_zarr(ZARR_PATH, mode="a", append_dim="time") else: # 如果主文件不存在,则新建 ds.to_zarr(ZARR_PATH, mode="w") ds.close() # 删除临时文件,节省空间 shutil.rmtree(path, ignore_errors=True) # 示例运行:读取 2001-11-07 至 2001-11-10 的数据 dates = pd.date_range("2001-11-07", "2001-11-10") for d in dates: tmp = read_one_day(d) # 下载并保存临时文件 merge_one(tmp) # 合并到主 Zarr 文件 print("全部完成")
常见问题与解决方案

在实际运行脚本时,可能会遇到以下问题:

  • 权限错误:检查 GCS 配置,公开数据需设置token="anon"。如果访问的是私有数据,需要配置服务账号或环境变量。

  • 内存不足:减少并行进程数MAX_WORKERS,或缩小批次大小BATCH_SIZE,避免一次性加载过多数据。

  • 网络中断:脚本支持断点续传,重新运行即可继续处理未完成的部分。

  • 文件损坏:如果临时 Zarr 文件损坏,脚本会自动删除并重新生成,确保最终结果完整。

应用场景与扩展

这种方法不仅适用于 ERA5 数据,还可以推广到其他大规模科学数据集:

  • 科研:气候模拟、天气预测、再分析数据处理。

  • 工程:AI 模型训练数据准备,尤其是需要高维气象数据的场景。

  • 扩展:同样的逻辑可以应用于其他对象存储系统,如AWS S3Azure Blob Storage,只需替换存储接口即可。

参考资料

  • ERA5 官方文档:https://www.ecmwf.int/en/forecasts/datasets/reanalysis-datasets/era5

  • xarray 文档: https://docs.xarray.dev/en/stable/

  • gcsfs 文档: https://gcsfs.readthedocs.io/en/latest/

  • Zarr 项目: https://zarr.readthedocs.io/en/stable/

  • Google Research ARCO ERA5 仓库: https://github.com/google-research/arco-era5

  • 完整代码和最新更新请见我的 GitHub 仓库: https://github.com/Schw11n/era5-gcs-to-zarr-

http://www.jsqmd.com/news/673341/

相关文章:

  • 2026年市场富氢水杯公司,氢氧机/吸氢机/富氢水杯/纯氢机/氢水机/富氢水机/富氢泡浴机,富氢水杯实力厂家有哪些 - 品牌推荐师
  • 从冷战到海湾战争:聊聊‘长曲棍球’雷达卫星如何用合成孔径雷达(SAR)穿透云层和烟雾
  • Debian 10 一键安装 Oracle 19C 单机
  • 2026年4月变电综合数字化远传表计监测终端厂家推荐:智能在线监测IED/一次设备在线监测/综合自动化监测终端实力品牌深度解析 - 品牌推荐用户报道者
  • 从IP调用量看AI落地热力图:哪些城市的AI应用最活跃?
  • 2026年4月 三螺杆挤出机厂家TOP推荐:积木式/平行/改性塑料三螺杆挤出机品牌深度解析与选购指南 - 品牌推荐用户报道者
  • AI 时代,年轻人用手搓应用开启社交新玩法,“全民手搓”时代要来了?
  • Java项目Loom化失败率高达63%?(2026 Gartner调研首发:3个被90%团队忽略的阻塞调用陷阱)
  • 做了几年 Oracle DBA,聊聊这行的真实状态
  • 测试架构师核心能力:缺陷预防设计
  • SAP 中供应商预付款业务主要涉及 FI 财务模块与 MM 物资模块,核心通过特殊总账标志实现统驭科目切换,业务流程涵盖订单创建到预付款清算的全环节
  • SQL多表关联查询中提升可读性的规范_合理缩进与表别名定义
  • MSP432P401R开发第一步:在CCS里正确导入DriverLib库并配置头文件路径(避坑指南)
  • 测试文章3 - API抓包
  • Dify合规问答配置失效真相:3家持牌机构被罚案例背后的2个底层配置逻辑漏洞
  • JUnit 5单元测试(三)—— Mockito 模拟实战:从零构建隔离测试环境
  • 告别鼠标!用这20个iTerm2快捷键,让你的Mac终端效率翻倍(保姆级配置指南)
  • V4L2调试不止抓图:用这些命令深挖Camera子系统和事件监听(以RK ISP为例)
  • 别再死记硬背Attention公式了!用Python+PyTorch手撕一个Hierarchical Attention Network(HAN)
  • 【侯俊霞全网最全收集--PLC1200/200SMART(88课时) 中级课程 第1章】
  • 软件测试计划模板
  • 5200000 个文件,rm -rf 报错,如何快速清理?
  • 车载问答系统开发不再踩坑:Dify v0.12.3适配Autosar AP平台完整技术白皮书(含ASAM MCD-2 MC接口映射表)
  • 【Dify插件开发黄金法则】:20年AI平台架构师亲授,从零构建可商用插件的5大核心步骤
  • 别再死磕理论了!用PCL+KinectFusion手把手教你从照片到3D模型(保姆级避坑指南)
  • 软件标准管理中的规范执行监督
  • 从源码演变看PyTorch forward设计:从v0.1.12到2.x的钩子(Hook)机制进化史
  • 【2026年最新600套毕设项目分享】微信小程序的新闻资讯系统(30117)
  • Path of Building:3大核心功能彻底改变流放之路角色构筑
  • 单细胞分析入门:用Python的AnnData管理你的第一个单细胞数据集(附代码)