Python 使用 AC3CMIP6 下载 CMIP6 数据

CMIP6数据解析:以气温数据为例
tas_Amon_CanESM5_ssp585_r1i1p1f1_gn_201501-210012.nc

  1. 变量前缀: tas – 这是文件中包含的主要气候变量的缩写。tas代表“气温”(Temperature)。
  2. 数据集合类型: Amon – 这表示数据是“大气”(Atmospheric)的月平均数据。CMIP6项目中还有其他类型的数据集合,如day(日数据)、mon(月数据)、Lmon(陆地月数据)等。
  3. 模型名称: CanESM5 – 这是执行模拟的气候模型的名称,即加拿大第五代地球系统模型(Canadian Earth System Model, version 5)。
  4. 共享社会经济路径情景: ssp585 – 这是模型模拟所采用的共享社会经济路径(Shared Socioeconomic Pathway, SSP)情景的编号。SSP585代表一个高温室气体排放的情景。
  5. 实验编号: r1i1p1f1 – 这是对实验的具体标识,其中:
    o r1 表示“run”,即实验的重复编号,r1通常是第一个实验重复。
    o i1 表示“initial condition”,即初始条件编号,i1通常是第一次模拟。
    o p1 表示“physics”,即模型的物理实验设置编号。
    o f1 表示“forcing”,即外部强迫或模型配置的变种编号。
  6. 数据集类型: gn – 这表示数据是在“gn”即“地面”(ground)网格上的,意味着这些数据是针对地表的。
  7. 时间范围: 201501-210012 – 这表示数据覆盖的时间范围,从2015年1月到2100年12月。
  8. 文件格式: .nc – 这表明文件格式为NetCDF。

acccmip6 -o S -m %s -v %s -e ssp585 -f mon -rlzn 1 -yr 1"%(i,j) + r" -dir ./CMIP6

-o: 指定输出类型。 ‘S’ 表示搜索数据库。 ‘D’ 表示从数据库下载数据。
-m: 模型名称。 允许多个名称,用逗号分隔。
-e: 实验名称。
-f: CMIP6输出频率。 例如 ‘mon’ 表示月数据,‘day’ 表示日数据等。
-v: 变量名称。
-r: 领域名称。 例如 ‘atmos’ 表示大气,‘ocean’ 表示海洋等。
-rlzn: 选择指定的实现方式。
-c: 使用检查器。 设置为 ‘yes’ 以在搜索或下载时使用检查器。 这有助于确定搜索项目当前是否可用。 如果不可用,它将产生与搜索密切相关的建议。
-desc: 获取描述。 设置为 ‘yes’ 以获取搜索到的实验的描述。
-dir: 下载目录。 指定下载文件的目标文件夹。
-skip: 跳过项目。 跳过下载中某些特定的模型/实验/实现。
-time: 打印时间周期。 设置为 ‘yes’ 以打印出所有可用的时间周期。
-yr: 选择时间段的数据。 指定需要选择数据的年数。
-n: 选择特定的数据节点。 允许选择多个节点。
-serv: 设置用户定义的服务器。
-cr: 选择实验中的共同实现。

先使用-o S,搜索该模式下是否有文件。

model_list = ['CanESM5']
var_list = ['tas']
import re
import subprocess

Num = []
for i in model_list:
    for j in var_list:
        try:
            dir = "acccmip6 -o S -m %s -v %s -e ssp585 -f mon -rlzn 1 -yr 1"%(i,j)
            print('%s %s'%(i,j))
            result = subprocess.run(dir, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)

            # 使用正则表达式查找包含数字的部分,找出存在几个文件
            pattern = '\x1b\[0m\s*(\d+)'
            match = re.search(pattern,result.stdout)
            if match:
                # 如果找到匹配的部分,则输出匹配的数字
                #print(match.group())
                str = '%s-%s-%s'%(i,j,match.group()[-1])
                Num.append(str)
            else:
                #print("No number found.")
                Num.append(-1)
        except Exception as e:
            print("发生错误:", str(e))

Num结果:

即CanESM5 ssp585 tas存在两个文件

下载:

model_list = ['CanESM5']
var_list = ['tas']
import re
import subprocess

Num = []
for i in model_list:
    for j in var_list:
        try:
            dir = "acccmip6 -o D -m %s -v %s -e ssp585 -f mon -rlzn 1 -yr 1"%(i,j) + r" -dir ./CMIP6"
            print('%s %s'%(i,j))
            subprocess.run(dir, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
        except Exception as e:
            print("发生错误:", str(e))

作者:horizon012

物联沃分享整理
物联沃-IOTWORD物联网 » Python 使用 AC3CMIP6 下载 CMIP6 数据

发表回复