前情提要
最近需要使用EC的一些数据,摸索下载过程中顺便记录下来,综合了EC上免费数据集的两个数据集的下载方式,使用python脚本下载
相比在网站上操作下载,个人更推荐脚本下载,官方已经封装好了两个库直接可以方便使用不需要爬虫操作,同时使用脚本下载可以更加便捷,通过更改参数可以自定义下载逻辑,放在服务器上下载也更加方便
一、EC公共数据集下载方式
官网公告:ECMWF 公共数据集服务即将停用,对大多数数据集的访问已关闭 或在 2023 年 6 月迁移到其他系统
目前只剩下两个数据集可以进行下载,并在2024年也将迁移至别的地方,但目前也是可以使用python进行批下载
1.1 注册EC账号并获取API Key
注册流程就不说了,很常规的注册流程,注册完之后打开这个链接,可以查看自己的API Key
1.2 创建配置文件
- windows用户就在用户目录根目录新建一个文件,命名为.ecmwfapirc
- 之后将刚才的API Key原封不动粘贴上去
1.3 Python环境配置
python的安装略过,可以使用pip或者conda安装,谁装的上用哪个
pip install ecmwf-api-client
1.4 获取下载脚本并下载
- 以其中的S2S数据为例,一路点进去选择好自己需要的数据之后,就可以自动创建下载脚本
- 将内容复制到python脚本中,运行即可
注意:如果想要下载nc格式的,需要在这个字典中添加format
二、Climate Data Store数据下载(包括ERA-5)
- 在官网这个位置,点进去也是一个包罗万象的数据集,比如ERA-5的数据都可以在此下载
2.1 注册账号获取API Key
- 同样注册好之后可以进入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数据有没更新,更新了就下载新的数据
文章评论