如何在使用 Python 下载之前对气候数据进行子集化?

问题描述

我的典型工作流程是下载大型数据集 (netcdf),然后按单个纬度/经度(网格点)对它们进行子集化。但是,我经常只需要一个特定变量的单个网格点,例如气温/降水,并且希望能够在下载之前有效地对大型数据集(例如 CMIP6)进行子集化,以便下载量很小。到目前为止,我已经尝试过使用 esgf-pyclient 提取单个网格点的变量(对于 1850 - 2100 年,~91,675 天/数据行)可能需要一个小时以上的时间。这种缓慢的速度违背了在下载之前进行子集化的目的。互联网不是问题,因为我的下载速度(以太网)> 1Gbps。如果有人有任何建议或替代工作流程,我们将不胜感激!

我用于 esgf-pyclient 的代码

from pyesgf.search import SearchConnection
import xarray as xr
import numpy as np

conn = SearchConnection('https://esgf-data.dkrz.de/esg-search',distrib=True)

ctx = conn.new_context(
    product = 'input',project = 'ISIMIP3b',# model = 'GFDL-ESM4',experiment='historical',variable='tasAdjust',#,tasminAdjust,tasmaxAdjust,prAdjust'
    time_frequency='day',data_node='esg.pik-potsdam.de'
    )
ctx.hit_count

result = ctx.search()[0]
result.dataset_id
files = result.file_context().search()
    
ds = xr.open_dataset(files[0].opendap_url).sel(lat=32.298583,lon=-97.78538710,method="nearest")

所需的输出将是所需网格点(纬度/经度)的 91,675 行、单列/数据向量。

解决方法

这似乎工作得更快:

import xarray as xr
    
folder = 'https://esg.pik-potsdam.de/thredds/dodsC/isimip_dataroot/isimip3b/input/clim_atm_sim/W5E5-ISIMIP3BASD2-5-0/MRI-ESM2-0/ssp370/tasAdjust/daily/v20210512/mri-esm2-0_r1i1p1f1_w5e5_ssp370_tasAdjust_global_daily_'
        remote_data1 = xr.open_dataset(folder + '2091_2100.nc',decode_times=False).isel(lat=31,lon=-99)
        remote_data2 = xr.open_dataset(folder + '2081_2090.nc',lon=-99)
        
        ds_all = xr.concat([remote_data1,remote_data2],dim = 'time',join='override',data_vars='minimal',coords='minimal',compat='override')