You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Python包chelsa-cmip6获取指定CHELSA CMIP6气候数据并生成多模型月平均TIFF文件

如何通过Python包chelsa-cmip6获取指定CHELSA CMIP6气候数据并生成多模型月平均TIFF文件

我来帮你一步步搞定这个需求,你已经找对了开头的参数配置方向,接下来咱们把代码补全,实现从数据获取到多模型月平均TIFF生成的完整流程:

第一步:确认依赖安装

首先确保你已经安装了chelsa-cmip6包,以及处理栅格数据所需的依赖库:

pip install chelsa-cmip6 gdal numpy

第二步:配置参数并初始化数据获取对象

你需要把目标模型都加入source_id列表,同时补充时间范围参数,具体代码如下:

from chelsa_cmip6.GetClim import chelsa_cmip6
import numpy as np
from osgeo import gdal, osr
import os

# 配置你需要的参数
project = ["CMIP6"]
# 把你指定的所有模型都加入这个列表
source_id = ["GFDL-ESM4", "IPSL-CM6A-LR", "MPI-ESM1-2-HR", "MPI-ESM2-0", "UKESM1-0-LL"]
experiment_id = ["ssp370"]
variant_label = ["r1i1p1f1"]
variable = ["tas"]
# 指定时间范围为2041-2070
time_range = ["2041-01-01", "2070-12-31"]

# 初始化数据获取对象
clim = chelsa_cmip6(project=project,
                   source_id=source_id,
                   experiment_id=experiment_id,
                   variant_label=variant_label,
                   variable=variable,
                   time_range=time_range)

第三步:下载并组织数据

调用get_data()方法下载数据,默认会把文件存在当前目录的CHELSA_CMIP6文件夹下。下载完成后,咱们需要按月份和模型来整理这些TIFF文件:

# 触发数据下载(如果文件已存在会跳过)
clim.get_data()

# 定义函数来读取TIFF文件为数组,同时保留地理信息
def read_tiff(tiff_path):
    ds = gdal.Open(tiff_path)
    band = ds.GetRasterBand(1)
    arr = band.ReadAsArray()
    # 获取地理信息,用于后续保存TIFF
    geo_transform = ds.GetGeoTransform()
    projection = ds.GetProjection()
    ds = None
    return arr, geo_transform, projection

# 按月份分组收集所有模型的日数据
monthly_data = {}
# 遍历每个模型的文件路径
for model in source_id:
    # 构建该模型的tas文件路径(根据包的默认存储结构)
    model_dir = f"./CHELSA_CMIP6/{model}/{experiment_id[0]}/{variable[0]}"
    # 遍历该目录下的所有TIFF文件(文件名格式类似 CHELSA_tas_*_YYYYMMDD.tif)
    for filename in os.listdir(model_dir):
        if filename.endswith(".tif") and "tas" in filename:
            # 从文件名提取年月(比如20410101提取204101)
            date_str = filename.split("_")[-1].split(".")[0]
            year_month = date_str[:6]
            tiff_path = os.path.join(model_dir, filename)
            # 读取TIFF数据
            arr, _, _ = read_tiff(tiff_path)
            # 加入对应月份的列表
            if year_month not in monthly_data:
                monthly_data[year_month] = []
            monthly_data[year_month].append(arr)

第四步:计算多模型月平均并导出TIFF

现在我们对每个月份的所有模型日数据取平均,然后保存为新的TIFF文件:

# 定义函数保存TIFF文件
def save_tiff(output_path, arr, geo_transform, projection):
    driver = gdal.GetDriverByName("GTiff")
    rows, cols = arr.shape
    ds = driver.Create(output_path, cols, rows, 1, gdal.GDT_Float32)
    ds.SetGeoTransform(geo_transform)
    ds.SetProjection(projection)
    band = ds.GetRasterBand(1)
    band.WriteArray(arr)
    band.FlushCache()
    ds = None

# 先获取一个样本文件的地理信息(所有数据地理范围一致)
sample_model_dir = f"./CHELSA_CMIP6/{source_id[0]}/{experiment_id[0]}/{variable[0]}"
sample_filename = next(f for f in os.listdir(sample_model_dir) if f.endswith(".tif"))
sample_tiff_path = os.path.join(sample_model_dir, sample_filename)
_, geo_transform, projection = read_tiff(sample_tiff_path)

# 遍历每个月份计算平均并保存
for year_month, data_list in monthly_data.items():
    # 将所有数组堆叠起来,计算平均值(按所有模型的所有日数据取平均)
    stacked_arr = np.stack(data_list, axis=0)
    mean_arr = np.mean(stacked_arr, axis=0)
    
    # 生成输出文件名
    output_filename = f"CHELSA_tas_multi-model_mean_{year_month}.tif"
    save_tiff(output_filename, mean_arr, geo_transform, projection)
    print(f"已生成月平均文件:{output_filename}")

注意事项

  • 下载数据可能需要较长时间,取决于你的网络速度和数据量;
  • 所有模型的TIFF数据地理范围和分辨率是一致的,所以可以直接堆叠计算平均;
  • 如果遇到文件路径问题,可以检查clim.get_data()输出的存储路径,确保模型目录的结构正确。

备注:内容来源于stack exchange,提问作者iibs1412

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 03:17:58