如何用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
相关产品推荐
相关产品推荐

