Py学习  »  Python

Python气象数据处理与绘图:如何利用python批量下载CMIP6数据

气象学家 • 1 年前 • 707 次点击  

  第一时间获取气象科研资讯

气象学家公众号交流群

加入



1、前言

        CMIP6数据在气象科研工作中经常被使用,下载方式主要是从官网上检索对应的模式后,通过wget下载。这种方式有一个弊端,即当所需下载的模式数量很多时,需先下载多个wget文件,然后再依次执行下载命令,这种方式需要占用大量的时间和精力,特别费眼睛,而且效率很低。为了解决这个问题,向大家介绍一种python自动化下载CMIP6数据的方式,下载完成后仅需要花费一些时间核对一下结果。

2、批量下载数据

        该方法的思路分为两个步骤:第一,先从wget文件中获取下载链接地址(http或者https),并将其保存至list中;第二,利用python的wget库+多线程的方式,开启自动下载方式。

        第一步工作涉及的代码如下,其中wget即为本次使用的关键库第2、5、6行的包是并行处理需要使用库3、4行为本次处理文件需要的包相关代码功能请参考代码注释。

import wgetimport multiprocessingimport osimport globfrom multiprocessing import Poolimport multiprocessing as mpimport


    
 numpy as npimport time#获得所有的sh文件fileList =  sorted(glob.glob('../wget_ssp/*.sh'))#i用来统计总共有多少nc文件需要下载i = 0#nc_data_urls用来存储所有nc下载路径nc_data_urls = []#以下循环遍历所有sh文件,得到i和nc_data_urlsfor fname in fileList:    print('==================================================')    print(fname)    #这个循环    with open(fname, 'r') as f:  # Open file for read        for line in f:           # Read line-by-line            line = line.strip()  # Strip the leading/trailing whitespaces and newline            #判断和查找nc下载链接            if 'sfcWind_' in line and ('https://' in line or 'http://' in line)  and '.nc' in line and 'SHA256' in line:                #统计nc文件个数                i = i + 1                substrings = line.split(' ')                print(substrings[1][1:-1])                #将链接保存                nc_data_urls.append(substrings[1][1:-1])#最后将nc总数打印出来,以便核对print('*******************************************')print('*******************************************')print('all nc files number:',len(nc_data_urls))print('*******************************************')print('*******************************************')

        第二步工作涉及的代码如下,首先定义一个下载函数,然后使用并行下载方式下载数据,大大提升效率。其中第9行的延时,我认为是非常重要的,主要目的是为了防止终端向服务器发送太多wget请求,超出服务器最大响应性能,从而导致数据下载失败率过高。

def downloadNCFile(url):    print('++++++++++++++++++++')    print('start download file:',url)    fileName = wget.download(url)    print('download over:',fileName)
pool = Pool(processes = 5)for i in np.arange(0,len(nc_data_urls)): time.sleep(10) pool.apply_async(downloadNCFile, (nc_data_urls[i],))
print( "Mark~ Mark~ Mark~~~~~~~~~~~~~~~~~~~~~~")pool.close()pool.join() #调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束print( "Sub-process(es) done.")

3、后记

在实际使用和结果核对阶段发现,ippool并行数量越多,最后缺失的nc数据可能也就越多,不管下载多少次,似乎都不能做到一次性100%的完整下载,比如下载2000+个nc文件,最后总是缺少一点,最后通过降低ippool并行数量和sleep延时,提高下载成功率,因此建议ippool低于10个,甚至可能3、5个就够了,并且适当增加请求间的延时。究其原因,猜测可能跟CMIP6数据服务器的性能有些关系,同一个ip一次性并发下载过多nc文件,服务器无法响应所有请求。






声明:欢迎转载、转发本号原创内容,可留言区留言或者后台联系小编(微信:gavin7576)进行授权。气象学家公众号转载信息旨在传播交流,其内容由作者负责,不代表本号观点。文中部分图片来源于网络,如涉及作品内容、版权和其他问题,请后台联系小编处理。


往期推荐

 获取ERA5/ERA5-Land再分析数据(36TB/32TB)

 获取全球GPM降水数据,半小时/逐日(4TB)

 获取1998-2019 TRMM 3B42逐日降水数据

  获取最新版本CMIP6降尺度数据集30TB

 EC数据商店推出Python在线处理工具箱

★ EC打造实用气象Python工具Metview

★ 机器学习简介及在短临天气预警中的应用

★ Nature-地球系统科学领域的深度学习及理解

★ 灵魂拷问:ChatGPT对气象人的饭碗是福是祸?

★ 气象局是做啥的?气象局的薪水多少?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/165760