python脚本下载ERA5数据详细规范和教程

python脚本下载ERA5数据详细规范和教程

ECMWF官网:

https://cds.climate.copernicus.eu/

在这里插入图片描述

API请求官方教程:

https://cds.climate.copernicus.eu/api-how-to

下载数据准备工作

注册官网账户,登录生成自己的UID和key

在这里插入图片描述

配置并安装CDS API

创建一个.cdsapirc文件 其实直接新建文本文档后再改也行,如下配置修改保存到C:\Users\用户下
在这里插入图片描述

安装cdsapi库

pip install cdsapi  #根据自己本地环境安装即可

下载数据规范

1.存储路径规范
/path/{产品要素}/{}/{}/{}

采用分要素下载数据文件

2.文件命名规范
ERA5-{year}{month}{day}_{type_str}.grib  #type_str是数据的variable

数据格式统一采用grib或者nc格式

python下载脚本

logging.basicConfig(filename='download_log_ERA5.log',
                    level=logging.INFO,
                    format='%(asctime)s - %(levelname)s - %(message)s')
def create_folder_if_not_exists(path):
    if not os.path.exists(path):
        os.makedirs(path)
        logging.info(f"创建文件夹: {path}")
    else:
        logging.info(f"文件夹已存在: {path}")


def is_valid_date(year, month, day):
    try:
        request_date = datetime(int(year), int(month), int(day))
        current_date = datetime.now()
        latest_era5_date = current_date - timedelta(days=5)
        if request_date > latest_era5_date:
            logging.error(f"请求日期{request_date}超过最新可用日期{latest_era5_date}")
            return False
        return True
    except ValueError as e:
        logging.error(f"无效日期: {year}-{month}-{day}, 错误: {e}")
        return False


def down(year, month, day, level, variables, type_str, path, retries=3, delay=60):
    if not is_valid_date(year, month, day):
        return

    month = f"{int(month):02d}"
    day = f"{int(day):02d}"

    dataset = "reanalysis-era5-pressure-levels"
    request = {
        'product_type': 'reanalysis',
        'variable': variables,
        'year': year,
        'month': month,
        'day': day,
        'time': ['00:00', '01:00', '02:00', '03:00', '04:00', '05:00',
                 '06:00', '07:00', '08:00', '09:00', '10:00', '11:00',
                 '12:00', '13:00', '14:00', '15:00', '16:00', '17:00',
                 '18:00', '19:00', '20:00', '21:00', '22:00', '23:00'],
        'pressure_level': level,
        'area': [90, -180, -90, 180], # 全球
        'format': 'grib'
    }

    client = cdsapi.Client()
    date_str = f"{year}/{month}/{day}"
    folder_path = os.path.join(path, date_str)
    file_name = f"ERA5-{year}{month}{day}_{type_str}.grib"
    file_path = os.path.join(folder_path, file_name)

    for attempt in range(retries):
        try:
            create_folder_if_not_exists(folder_path)
            logging.info(f"开始下载: {date_str} {type_str}")
            client.retrieve(dataset, request, file_path)
            logging.info(f"下载成功: {file_path}")
            return
        except Exception as e:
            logging.error(f"下载失败: {e},尝试 {attempt + 1}/{retries}")
            if attempt < retries - 1:
                time.sleep(delay)
            else:
                logging.error(f"全部重试失败: {date_str}")


with open("part.json", encoding='utf-8') as f:
    content = json.load(f)

for c in content:
    year = c['year']
    month = c['month']
    day = c['day']
    if not is_valid_date(year, month, day):
        continue
    for type_var in c['variableUPAR']:
        base_path = "/ERA5/"
        # 处理组合变量情况/风场数据
        if type_var == 'uv_component_of_wind':
            variables = ['u_component_of_wind', 'v_component_of_wind']
            type_str = 'uv_component_of_wind'
        else:
            variables = [type_var]
            type_str = type_var
        down(year, month, day, c['level'], variables, type_str, base_path)

注意事项

下载时间维度、空间维度、时间维度、产品选择在脚本中可根据需求修改

下载完的样例

在这里插入图片描述
在这里插入图片描述

数据下载规范:

数据下载规范:[自定义规范,根据实际情况设计]
ERA5再分析资料,详情官网学习。
统一数据下载使用开发规范,数据下载必须规范文件名、数据结构、数据格式、数据存储
1.文件名规范:
【ERA5-日期-要素名.grib 】按照单要素、时间1天【00:00-23:00】下载单个文件数据
例:ERA5-yyyymmdd-2m_temperature.grib
2.数据结构规范:
数据结构遵循grib国际规范,variable存储要素、时间维度、空间维度都为二维格点数组【包含要素、时间、经度、维度、气压层】
3.数据格式规范:
统一使用grib或者nc格式【目前统一使用grib格式】
4.数据存储规范:
基础规范遵循:数据大类/数据小类////文件【根据数据情况实际调整】	
例:era5\surf\2025\03\26\ERA5-yyyymmdd-2m_temperature.grib
5.数据下载验证:
    数据下载后需要验证是否满足格式、结构要求,使用可视化工具查看验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值