前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【亲测有效】Python+IDM多线程加速批量下载ERA5数据

【亲测有效】Python+IDM多线程加速批量下载ERA5数据

作者头像
自学气象人
发布2023-01-31 18:22:27
4.4K2
发布2023-01-31 18:22:27
举报
文章被收录于专栏:自学气象人自学气象人

本文由博主菩提有树提供,点击阅读原文即可跳转。 在这里也十分感谢李雅轩同学将她测试过成功的这个好用的方法分享给我们。

本文介绍了如何通过Python脚本和Internet Download Manager(IDM)软件批量下载ERA5数据。

1. ERA5数据简介

ERA5是第五代ECMWF大气再分析全球气候数据,该数据集的第一部分现在可以公开使用(1979年到3个月内)。ERA5数据提供每小时的大气、陆地和海洋气候变量的估计值,地球数据精确到了30km网格,包括了137层的大气数据。

ERA5数据位于Climate Data Store(CDS)网站上,网址如下:

代码语言:javascript
复制
https://cds.climate.copernicus.eu/cdsapp#!/search?type=dataset&text=ERA5

2. 准备工作

(1) 注册CDS帐号

只有完成帐号注册后才能下载数据,注册网址如下:

代码语言:javascript
复制
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” 文件中输入如下内容:

代码语言:javascript
复制
url: https://cds.climate.copernicus.eu/api/v2
key: UID:API Key

打开控制台,在cmd中输入如下命令,安装cdsapi第三方库。

代码语言:javascript
复制
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” 的选项,点击后会出现如下代码:

代码语言:javascript
复制
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文件。

代码语言:javascript
复制
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软件进行下载,这需要获取每个数据的下载地址,可以通过下列代码实现:

代码语言:javascript
复制
r = c.retrieve('reanalysis-era5-single-levels', dic, )  # 文件下载器
url = r.location  # 获取文件下载地址

然后将文件下载地址添加进IDM软件中实现快速下载:

代码语言:javascript
复制
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'])

批量下载完整代码:

代码语言:javascript
复制
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. 最后

内容仅供大家学习参考,若有不足之处,敬请大家批评指正!

欢迎加入读友交流群

因为群聊已满200人,需扫描下方二维码添加小编微信拉你入群

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-12-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 自学气象人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档