CMIP6数据下载相关

最近的研究有关于CMIP6,其中在数据下载方面有很多需要注意的点,本文将系统性的介绍一下。


数据背景介绍

CMIP6,即第6次国际耦合模式比较计划(Coupled Model Inter-comparison Project, CMIP),是由世界气候研究计划耦合模拟工作组(WGCM)发起和组织。其最初目的是对当时数量有限的全球耦合气候模式的模拟性能进行比较。但此后全球海-气耦合模式进入了快速发展阶段,全球各大气候模拟中心相继发布大量的大气和海洋模拟数据。因此,产生了对这些模拟结果进行系统分析的需求。为适应这一需求,CMIP 逐渐发展成为以“推动模式发展和增进对地球气候系统的科学理解”为目标的庞大计划。

1995年,WGCM 发起和组织了 AMIP 计划,对当时数量有限的全球耦合气候模式的性能进行比较。此后,全球海气耦合模式进入了快速发展阶段,模式数量迅速增加,模式数据爆发式增长。全球各大气候模拟中心相继发布大量的大气和海洋模拟数据,科学界迫切需要有专门的组织对这些模拟结果进行系统的分析。为适应这一需求,CMIP 逐渐发展成为以“推动模式发展和增进对地球气候系统的科学理解”为目标的庞大计划。为了实现该目标,CMIP 在设计气候模式试验标准、制定共享数据格式、制定向全球科学界共享气候模拟数据的机制等方面开展了卓有成效的工作。

WGCM 设立了两个工作小组:一是 CMIP 工作组(CMIP Panel),直接负责 CMIP 的组织协调工作;二是 WGCM 基础设施工作组(Infrastructure Panel),负责制定模式数据共享政策和技术标准。CMIP 试验数据通过地球系统网格联盟(Earth System Grid Federation,ESGF)面向国际科学界提供。

CMIP6 计划介绍:https://pcmdi.llnl.gov/CMIP6/
CMIP6 数据下载地址:https://esgf-node.llnl.gov/search/cmip6/
建议使用英国源:https://esgf-index1.ceda.ac.uk/search/cmip6-ceda/ (2023.11.01更新:现在英国源似乎有问题不让下载,还是走官方地址吧)

数据筛选

CMIP6 各变量及对应缩写介绍:https://clipc-services.ceda.ac.uk/dreq/mipVars.html
可以通过输入关键词搜索自己想要的变量的缩写,或者在官网下载缩写对应表的 excel 文件。

pic1

这里对一般情况下,我们用到的检索条件做个简要的介绍

MIP Era:即 MIP 代际数,这里只有一个可选,即最新的 MIP6;
Activity:项目计划;
Product:研究产品,即模型输出,这里依旧是只有一个 model-output 可选;

Source ID:各种评估模式的名称,CMIP6 有 9 个模式来自中国;
Institution ID:各个评估机构的名称;
Source Type:数据源类型,一般是某种大气动力学模型;
Nominal Resolution:空间分辨率,一般有 100km、250km 等;

Experiment ID:研究的实验场景,如历史模拟(historical),各种 ssp 情景等等;
Sub-Experiment:子实验名称;
Variant Label:变量标签,一般选 r1i1p1f1;
Grid Label:网格标签,一般选 gn,即原始网格;

Table ID:研究的时间尺度代码;
Frequency:研究的时间尺度,如日尺度、月尺度,小时尺度等等;
Realm:数据领域,如 atmos 代表大气;
Variable:研究的变量,如降雨、降雪、均温等等;
CF Standard Name:变量的标准名称;

Data Node:数据节点,即数据来源。

  • 其中,ssp 后面的数字含义为共享的社会经济路径 (Shared Socioeconomic Pathways, SSP) + 代表性浓度路径 (Representative Concentration Pathways, RCP)。
  • 举例来说,ssp245 指的是在 ssp2 路径下(即“中间路线”世界),温室气体等辐射强迫控制在 \(4.5W/m^2\) 的情景

一般来说,选了以上三个检索条件后,就可以点击search了。
在结果中再点击 Source ID,查看有哪些模型符合这个检索条件。需根据实际情况进行调整。 注意:有的时候 search 会显示没有对应文件或者文件失效,这个时候可以把 Show All Replicas 选中再 search 就有文件了。

pic2

根据需求筛选好条目之后,点开所有条目的 List Files,可以看到每一个对应文件的文件名、checksum 值、文件大小以及 id 号,还有最重要的下载链接。

pic3

1
2
条目命名规则:{MIP_Era}.{Activity}.{Institution_ID}.{Source_ID}.{Experiment_ID}.{Variant_Label}.{Table_ID}.{Variable}.{Grid_Label}
文件命名规则:{Variable}_{Table_ID}_{Source_ID}_{Experiment_ID}_{Variant_Label}_{Grid_Label}_{Time}.nc

数据下载

一般来说 CMIP6 的数据都是 .nc 文件,且大多都需要连续下载很多的文件,这时候可以使用两个工具:

  • 第一个是 Simple Mass Downloader,这是一个浏览器插件,可以实现网页内的下载链接的查找与筛选,也可以实现链接的批量下载   Microsoft Edge 链接 Google Chrome 链接
  • 第二个是 Wget,这个工具可以实现批量下载一个 .txt 文件中的所有下载链接,且具有断点续传功能,非常实用。

在上述筛选和全部条目 List File 步骤完成以后(文件多的条目一定要点击 Show All Files),点击浏览器的 Simple mass downloader 插件,依次执行下图中的6个步骤,即可得到⼀个包含本页所有下载链接的 txt 文件并保存到本地。

pic4 pic5

之后使用 Wget 批量下载文件,打开命令行输入指令:

1
wget -c -i C:/Users/Lenovo/Downloads/ssp245-day-tasmax.txt -P E:/Data/cmip6/ssp245-day-tasmax --no-check-certificate
其含义是按照 "C:/Users/Lenovo/Downloads/ssp245-day-tasmax.txt" 中的下载链接,将文件下载到文件夹 "E:/Data/cmip6/ssp245-day-tasmax" 中,同时不检查网站证书。

Wget的常用命令可参考:https://hscyber.github.io/posts/a53b1b2b

数据读取与处理

根据给定空间范围/坐标数据提取 nc 文件中的数据到 pickle 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import xarray as xr
import time
import glob
import gc


# 根据给定空间范围 / 坐标数据提取nc文件(L0级)中的数据到 pickle 文件(L1级)
def L0_extract(nc_folder: str, lat: list, lon: list, out_folder: str, method: str):

# 数据提取到本地保存
nc_file_col = glob.glob(nc_folder + '/*.nc')
for nc_file in nc_file_col:

t1 = time.time() # 计时
infile_name = nc_file[nc_file.rfind('\\') + 1:nc_file.rfind('.')] # 输入输出文件
outfile_name = out_folder + '\\' + infile_name + '_CN.zip'
if outfile_name in glob.glob(out_folder + '/*.zip'): # 跳过已经完成的文件
continue

dx = xr.open_dataset(nc_file)
dx['time'] = dx['time'].dt.strftime('%Y-%m-%d') # 日期
df = dx.to_dataframe()

# 按经纬度范围和时间范围检索数据
if method == 'by_region': # 根据给定空间范围
region_cond = 'lat >= ' + str(lat[0]) + ' and lat <= ' + str(lat[1]) + \
' and lon >=' + str(lon[0]) + ' and lon <= ' + str(lon[1])

else: # 根据给定坐标数据
region_cond = 'lat == ' + str(lat[0]) + ' and lon ==' + str(lon[1])
df_sel = df.query(region_cond).copy()

df_sel.to_pickle(outfile_name) # 导出为pickle文件
gc.collect()
t2 = time.time()
print(infile_name, 'costs {0:.2f} minutes'.format((t2 - t1) / 60))

根据 pickle 数据文件,按给定时空条件提取数据到 csv 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import os
import pandas as pd
import geopandas as gpd
import glob
from scipy.interpolate import griddata


# 根据L1级数据文件,按给定时空条件提取数据到csv文件(L2级)
def L1_extract(in_folder, out_folder, point_file, var_name):

# 设定筛选时间范围
sel_date_range = pd.date_range('2015-01-01', '2050-12-31').astype(str).to_list()
gdf_pnt = gpd.read_file(point_file)[['city_code', 'city_name', 'geometry']]

# 提取数据
for folder_name in os.listdir(in_folder):

folder_path = os.path.join(in_folder, folder_name) # 进入模型子目录
df_all = pd.DataFrame([]) # 每一个目录保存为一个dataframe
for f_name in glob.glob(folder_path + '/*.zip')[:]:

length = len(var_name) + 5 # 字符串匹配提取模型名称
model = f_name[f_name.rfind(var_name + '_day_') + length:]
model = model[:model.find('_')]

df = pd.read_pickle(f_name)[[var_name]] # 读取pickle文件
sel_bnds = df.index.get_level_values('bnds').unique()[0]
df = df.xs(sel_bnds, level='bnds')
date_range = df.index.get_level_values('time').unique()

# 匹配在筛选时间内的数据
for days in sel_date_range:
if days in date_range:
print('Processing:', str(model), str(days))
df_day = df.xs(days, level='time').reset_index()
pnt_val = griddata(df_day.loc[:, ['lon', 'lat']].to_numpy(),
df_day[var_name].to_list(),
(gdf_pnt.geometry.x.to_list(), gdf_pnt.geometry.y.to_list()),
method='linear')

df_out = pd.DataFrame([]) # 设置临时dataframe存储数据
df_out['city_code'] = gdf_pnt.city_code
df_out[var_name + '_' + model] = pnt_val
df_out['date'] = days
df_all = pd.concat([df_all, df_out]) # dataframe拼接

# 设置保存路径及文件名,保存为csv文件
out_path = os.path.join(out_folder, var_name)
if not os.path.exists(out_path):
os.mkdir(out_path)
out_file = os.path.join(out_path, var_name + '_' + folder_name + '.csv')
df_all.to_csv(out_file, index=False)

其他相关教程及参考资料

CMIP6 简介与数据工具 ACCCMIP6 介绍:https://zhuanlan.zhihu.com/p/599843527

参考文献:
王磊, 包庆, 何编. CMIP6 高分辨率模式比较计划(HighResMIP)概况与评述[J]. 气候变化研究进展, 2019, 15(5): 498-502.
DOI: 10.12006/j.issn.1673-1719.2019.077 周天军, 邹立维, 陈晓龙. 第六次国际耦合模式比较计划(CMIP6)评述[J]. 气候变化研究进展, 2019, 15(05): 445-456.