本文介绍了如何通过Python脚本和Internet Download Manager(IDM)软件批量下载ERA5数据。
1. ERA5数据简介
- ERA5是第五代ECMWF大气再分析全球气候数据,该数据集的第一部分现在可以公开使用(1979年到3个月内)。ERA5数据提供每小时的大气、陆地和海洋气候变量的估计值,地球数据精确到了30km网格,包括了137层的大气数据。
- ERA5数据位于Climate Data Store(CDS)网站上,网址如下:https://cds.climate.copernicus.eu/cdsapp#!/search?type=dataset&text=ERA5
2. 准备工作
- (1) 注册CDS帐号
- 只有完成帐号注册后才能下载数据,注册网址如下:https://cds.climate.copernicus.eu/user/register?destination=%2F%23!%2Fhome
- 直接用邮箱注册就可以。
- (2) 获取API key
- 注册完成后,进行登录,点击右上角的用户,查看用户信息:
-
记录下UID和API key,稍后需要用到。
-
(3) 配置并安装CDS API
-
在路径 “C:\Users\用户名” 底下创建 “.cdsapirc” 文件(先创建一个 “.cdsapirc.txt” 文件,然后再把 “.txt” 删掉),在 “.cdsapirc” 文件中输入如下内容:
url: https://cds.climate.copernicus.eu/api/v2
key: UID:API Key
- 打开控制台,在cmd中输入如下命令,安装cdsapi第三方库。
pip install cdsapi
- (4) 安装和配置IDM软件
- IDM是 “Internet Download Manager” 的简称,是一款非常强大的下载软件。
- 安装包链接:https://pan.baidu.com/s/1iojjYOg_Y2NdMcmJahz_pw ,提取码:dimq,版本为v6.36 Build 7,资源来自胡萝卜周。
- 下载好安装包后打开文件夹,双击 “idman636build7.exe” 开始安装IDM,一直点击前进,安装至默认位置即可。
- 将破解补丁复制到IDM安装目录下(默认位置为 “C:\Program Files (x86)\Internet Download Manager” ),双击运行破解补丁,点击 “破解IDM”,破解后点击 “完成” 关闭补丁。
- 注意:不要更新IDM,否则可能会导致软件不可用。
- 对IDM进行配置,打开软件,在主界面中找到 “选项”,打开。
- 在选项窗口中,找到 “连接” 页面,修改 “连接类型/速度”为 “较高速率连接:局域网/Wi-Fi/移动网络4G/其他”,修改 “默认最大连接数”为16,点击 “确定” 完成配置。
- 至此,下载前准备工作完成。
3. 批量下载
- 下载单个数据:
- 选择所需要的数据,以 “ERA5 hourly data on single levels from 1979 to present” 数据集为例,打开数据页面,选择 “Download data”,在页面中根据自己需要进行数据选择。
- 数据选择完后,将页面翻到底,可以看到 “Show API request” 的选项,点击后会出现如下代码:
import cdsapi # 导入cdsapi库
c = cdsapi.Client() # 创建用户
# 下载数据
c.retrieve(
'reanalysis-era5-single-levels', # 数据集名称
{
'product_type': 'reanalysis', # 产品类型
'format': 'netcdf', # 数据格式
'variable': '2m_temperature', # 变量名称
'year': '1979', # 年
'month': '01', # 月
'day': [ # 日
'01', '02', '03',
'04', '05', '06',
'07', '08', '09',
'10', '11', '12',
'13', '14', '15',
'16', '17', '18',
'19', '20', '21',
'22', '23', '24',
'25', '26', '27',
'28', '29', '30',
'31',
],
'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',
],
},
'download.nc') # 存储文件名称
- 将上述代码复制到Python中运行,即可下载1979年1月全球2 m温度再分析数据。
- 但是,上述方法通过Python来下载,速度较慢,且无法批量下载。
- 批量下载数据:
- 例如,要下载 “ERA5 hourly data on single levels from 1979 to present” 数据集中1979年到2020年每个月的全球2 m温度再分析数据,并保存为nc文件。
import cdsapi
import calendar
c = cdsapi.Client() # 创建用户
# 数据信息字典
dic = {
'product_type': 'reanalysis', # 产品类型
'format': 'netcdf', # 数据格式
'variable': '2m_temperature', # 变量名称
'year': '', # 年,设为空
'month': '', # 月,设为空
'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'
]
}
# 通过循环批量下载1979年到2020年所有月份数据
for y in range(1979, 2021): # 遍历年
for m in range(1, 13): # 遍历月
day_num = calendar.monthrange(y, m)[1] # 根据年月,获取当月日数
# 将年、月、日更新至字典中
dic['year'] = str(y)
dic['month'] = str(m).zfill(2)
dic['day'] = [str(d).zfill(2) for d in range(1, day_num + 1)]
filename = 'E:\\Data\\ERA5\\1979-2020\\2m_temperature\\'
+ str(y) + str(m).zfill(2) + '.nc' # 文件存储路径
c.retrieve('reanalysis-era5-single-levels', dic, filename) # 下载数据
- 上述代码虽然实现了批量下载,但还是通过Python下载,下载速度慢。为了提高下载速度,使用IDM软件进行下载,这需要获取每个数据的下载地址,可以通过下列代码实现:
r = c.retrieve('reanalysis-era5-single-levels', dic, ) # 文件下载器
url = r.location # 获取文件下载地址
- 然后将文件下载地址添加进IDM软件中实现快速下载:
from subprocess import call
def idmDownloader(task_url, folder_path, file_name):
"""
IDM下载器
:param task_url: 下载任务地址
:param folder_path: 存放文件夹
:param file_name: 文件名
:return:
"""
# IDM安装目录
idm_engine = "C:\\Program Files (x86)\\Internet Download Manager\\IDMan.exe"
# 将任务添加至队列
call([idm_engine, '/d', task_url, '/p', folder_path, '/f', file_name, '/a'])
# 开始任务队列
call([idm_engine, '/s'])
- 批量下载完整代码:
import cdsapi
import calendar
from subprocess import call
def idmDownloader(task_url, folder_path, file_name):
"""
IDM下载器
:param task_url: 下载任务地址
:param folder_path: 存放文件夹
:param file_name: 文件名
:return:
"""
# IDM安装目录
idm_engine = "C:\\Program Files (x86)\\Internet Download Manager\\IDMan.exe"
# 将任务添加至队列
call([idm_engine, '/d', task_url, '/p', folder_path, '/f', file_name, '/a'])
# 开始任务队列
call([idm_engine, '/s'])
if __name__ == '__main__':
c = cdsapi.Client() # 创建用户
# 数据信息字典
dic = {
'product_type': 'reanalysis', # 产品类型
'format': 'netcdf', # 数据格式
'variable': '2m_temperature', # 变量名称
'year': '', # 年,设为空
'month': '', # 月,设为空
'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'
]
}
# 通过循环批量下载1979年到2020年所有月份数据
for y in range(1979, 2021): # 遍历年
for m in range(1, 13): # 遍历月
day_num = calendar.monthrange(y, m)[1] # 根据年月,获取当月日数
# 将年、月、日更新至字典中
dic['year'] = str(y)
dic['month'] = str(m).zfill(2)
dic['day'] = [str(d).zfill(2) for d in range(1, day_num + 1)]
r = c.retrieve('reanalysis-era5-single-levels', dic, ) # 文件下载器
url = r.location # 获取文件下载地址
path = 'E:\\Data\\ERA5\\1979-2020\\2m_temperature' # 存放文件夹
filename = str(y) + str(m).zfill(2) + '.nc' # 文件名
idmDownloader(url, path, filename) # 添加进IDM中下载
4. 最后
- 内容仅供大家学习参考,若有不足之处,敬请大家批评指正!