You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python的CDS API批量下载ERA5日NC数据?循环及文件名设置问题

解决ERA5日数据按天拆分下载并指定文件名的问题

下面用Python结合cdsapi库实现你的需求,以2022年1月总降水量(total_precipitation)为例,每天生成一个独立的NetCDF文件,命名格式为TP_01_01.nc到TP_01_31.nc:

前置准备

  • 确保已安装cdsapi库:pip install cdsapi
  • 已配置好CDS API密钥(在用户目录下创建.cdsapirc文件)

完整代码示例

import cdsapi
from datetime import datetime, timedelta
import os

# 初始化CDS客户端
c = cdsapi.Client()

# 目标年份、月份与存储文件夹
target_year = 2022
target_month = 1
target_dir = "./ERA5_TP_202201"

# 创建目标文件夹(不存在则自动生成)
os.makedirs(target_dir, exist_ok=True)

# 定义下载区域(格式:[north, west, south, east],可自行修改经纬度范围)
area = [55, 70, 15, 140]

# 生成当月起始与结束日期
start_date = datetime(target_year, target_month, 1)
end_date = datetime(target_year, target_month + 1, 1) - timedelta(days=1)

# 循环遍历当月每一天
current_date = start_date
while current_date <= end_date:
    # 格式化CDS所需的日期字符串
    date_str = current_date.strftime("%Y-%m-%d")
    # 生成符合要求的输出文件名
    output_filename = os.path.join(target_dir, f"TP_{current_date.strftime('%m_%d')}.nc")
    
    # 调用CDS API下载单日数据
    c.retrieve(
        'reanalysis-era5-single-levels',
        {
            'product_type': 'reanalysis',
            'format': 'netcdf',
            'variable': 'total_precipitation',
            'year': str(target_year),
            'month': current_date.strftime("%m"),
            'day': current_date.strftime("%d"),
            'time': [f"{h:02d}:00" for h in range(24)],
            'area': area,
        },
        output_filename
    )
    
    # 日期推进一天
    current_date += timedelta(days=1)

关键部分说明

  • 日期循环逻辑:借助datetime和timedelta自动处理不同月份的天数差异,无需手动指定当月天数
  • 文件名格式化:用strftime("%m_%d")生成两位数字的月份和日期,确保文件名严格符合TP_XX_XX.nc格式
  • 区域自定义:area参数按[北, 西, 南, 东]顺序填写经纬度,可直接替换为你的研究区域范围
  • 变量替换:如果需要下载其他变量,将variable字段替换为ERA5对应的变量名即可(比如2m_temperature代表2米气温)

内容的提问来源于stack exchange,提问作者Mllearner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 15:10:39