Python脚本批量下载ECWMF免费数据教程(含ERA5自动下载最新数据脚本)

前情提要

最近需要使用EC的一些数据,摸索下载过程中顺便记录下来,综合了EC上免费数据集的两个数据集的下载方式,使用python脚本下载

相比在网站上操作下载,个人更推荐脚本下载,官方已经封装好了两个库直接可以方便使用不需要爬虫操作,同时使用脚本下载可以更加便捷,通过更改参数可以自定义下载逻辑,放在服务器上下载也更加方便

一、EC公共数据集下载方式

官网公告:ECMWF 公共数据集服务即将停用,对大多数数据集的访问已关闭 或在 2023 年 6 月迁移到其他系统

目前只剩下两个数据集可以进行下载,并在2024年也将迁移至别的地方,但目前也是可以使用python进行批下载

EC公共数据集网址
在这里插入图片描述

1.1 注册EC账号并获取API Key

注册流程就不说了,很常规的注册流程,注册完之后打开这个链接,可以查看自己的API Key
在这里插入图片描述

1.2 创建配置文件

  1. windows用户就在用户目录根目录新建一个文件,命名为.ecmwfapirc
    在这里插入图片描述
  2. 之后将刚才的API Key原封不动粘贴上去
    在这里插入图片描述

1.3 Python环境配置

python的安装略过,可以使用pip或者conda安装,谁装的上用哪个

pip install ecmwf-api-client

1.4 获取下载脚本并下载

  1. 以其中的S2S数据为例,一路点进去选择好自己需要的数据之后,就可以自动创建下载脚本
    在这里插入图片描述
  2. 将内容复制到python脚本中,运行即可
    在这里插入图片描述
    注意:如果想要下载nc格式的,需要在这个字典中添加format

二、Climate Data Store数据下载(包括ERA-5)

在这里插入图片描述

  • 在官网这个位置,点进去也是一个包罗万象的数据集,比如ERA-5的数据都可以在此下载

在这里插入图片描述

2.1 注册账号获取API Key

  1. 同样注册好之后可以进入user profiles查看自己的API Key
    在这里插入图片描述

2.2 创建配置文件

与EC公共数据集类似,也要在用户根目录创建名为.cdsapirc的文件
文件内容可以访问这个网址,就可以看到自己属于自己的键值对,直接拷贝进文件中保存
在这里插入图片描述
在这里插入图片描述

2.3 Python环境配置

安装cdsapi

pip install cdsapi

2.4 获取下载脚本并下载

以ERA5为例,在网站中找到ERA5数据之后
在这里插入图片描述
选好需要的参数之后,点击show API request
在这里插入图片描述
复制到一个py脚本中运行即可
在这里插入图片描述

三、ERA5自动下载最新数据脚本

3.1 官网生成脚本样本

逐小时ERA5,选择好变量之后会生成下载脚本,我们拷贝下来给他封装一下
在这里插入图片描述

3.2 封装为工具类后下载

将ERA5下载部分封装在一个工具类中,传入下载时间就可以控制需要下载的部分,要是想以传参的方式控制下载变量与气压层稍微改动就行,我这里只关注时间

import cdsapi
import os
from datetime import datetime, timedelta
import time
import sys


class ApiDownloader:  
    @staticmethod
    def download_era5_pressure_levels(year, month, day, save_dir):
        if os.path.exists(os.path.join(save_dir, f'{year}{month:02}{day:02}.nc')):
            return
        c = cdsapi.Client()
        c.retrieve(
            'reanalysis-era5-pressure-levels',
            {
                'product_type': 'reanalysis',
                'variable': [
                    'divergence', 'fraction_of_cloud_cover', 'geopotential',
                    'ozone_mass_mixing_ratio', 'potential_vorticity', 'relative_humidity',
                    'specific_cloud_ice_water_content', 'specific_cloud_liquid_water_content', 'specific_humidity',
                    'specific_rain_water_content', 'specific_snow_water_content', 'temperature',
                    'u_component_of_wind', 'v_component_of_wind', 'vertical_velocity',
                    'vorticity',
                ],
                'pressure_level': [
                    '1000', '850', '700', '500', '300', '200', '100', '50'
                    # '1', '2', '3',
                    # '5', '7', '10',
                    # '20', '30', '50',
                    # '70', '100', '125',
                    # '150', '175', '200',
                    # '225', '250', '300',
                    # '350', '400', '450',
                    # '500', '550', '600',
                    # '650', '700', '750',
                    # '775', '800', '825',
                    # '850', '875', '900',
                    # '925', '950', '975',
                    # '1000',
                ],
                'year': year,
                'month': month,
                'day': [
                    day,
                ],
                'time': [
                    '00:00', '12:00'
                    # '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',
                ],
                'format': 'netcdf',
            },
            os.path.join(save_dir, f'{year}{month:02}{day:02}.nc'))
  • 之后在另一个文件中作为controller控制下载逻辑
from ec_api_downloader import ApiDownloader
import time
from datetime import datetime, timedelta
import os

def download_api_era5(interval_hour):
    save_dir = '../download_res/era5'
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)
    while True:
    // 因为我看到ERA5只有当前时间前五天的数据,因此-7天
        day = datetime.now().date() - timedelta(days=7)
        ApiDownloader.download_era5_pressure_levels(day.year, day.month, day.day, save_dir)
        time.sleep(interval_hour * 60 * 60)


if __name__ == '__main__':
    download_api_era5(12)
  • 这样就可以实现每隔12小时执行一次这个代码来看ERA5数据有没更新,更新了就下载新的数据
  • 12
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值