微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在使用 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')

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。