如何使用 for 循环使用 Siphon 下载 GFS url 数据

问题描述 投票:0回答:2

我正在尝试使用虹吸库循环下载 GFS 数据的子集。我通常可以按照代码布局的方式一次下载一个文件。我想知道如何从2020年1月到2022年12月从003 UTC周期下载到168周期,这样我就不需要一次下载一个文件了?

from siphon.catalog import TDSCatalog
from siphon.ncss import NCSS
import numpy as np
import ipywidgets as widgets
from datetime import datetime, timedelta
import xarray as xr
from netCDF4 import num2date

# Download SUBSET GFS - Radiação (6 Hour Average) e PBLH

for i in range(6,168,6):
        for day in range(1,32,1):
            for month in range(1,13,1):
                dir_out = '/home/william/GFS_Siphon/2020'+'{:0>2}'.format(month)
                if not os.path.exists(dir_out):
                    os.makedirs(dir_out)
                if not os.path.isfile('/home/william/GFS_Siphon/2020'+'{:0>2}'.format(month)+'/gfs.0p25.2020'+'{:0>2}'.format(month)+'{:0>2}'.format(day)+"00.f"+'{:0>3}'.format(i)+'.nc'):
                    catUrl = "https://rda.ucar.edu/thredds/catalog/files/g/ds084.1/2020/2020"+'{:0>2}'.format(month)+'{:0>2}'.format(day)+"/catalog.xml"
                    datasetName = 'gfs.0p25.2020'+'{:0>2}'.format(month)+'{:0>2}'.format(day)+"00.f"+'{:0>3}'.format(i)+'.grib2'
                    time.sleep(0.01)
                    catalog = TDSCatalog(catUrl)
                    ds = catalog.datasets[datasetName]
                    ds.name
                    ncss = ds.subset()
                    query = ncss.query()
                    query.lonlat_box(east=-30, west=-50, south=-20, north=0)
                    query.variables( 
                        'Downward_Short-Wave_Radiation_Flux_surface_6_Hour_Average',
                        'Planetary_Boundary_Layer_Height_surface').add_lonlat()
                    query.accept('netcdf4')
                    nc = ncss.get_data(query)
                    data = xr.open_dataset(xr.backends.NetCDF4DataStore(nc))
                    data.to_netcdf('/home/william/GFS_Siphon/2020'+'{:0>2}'.format(month)+'/gfs.0p25.2020'+'{:0>2}'.format(month)+'{:0>2}'.format(day)+"00.f"+'{:0>3}'.format(i)+'.nc')

上面的脚本可以满足我的需要,但是在下载文件一段时间后,代码因以下错误而终止:

ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

会发生什么?

for-loop netcdf python-xarray gfs python-siphon
2个回答
1
投票

不幸的是,THREDDS 和 NCSS 无法根据模型参考时间进行请求,因此无法避免循环访问文件。

我会说这是一大堆数据,所以至少要确保你善待公共服务器。下载将近 3 年的数据是您应该随着时间的推移缓慢并谨慎地进行的事情,以免影响其他人使用此共享的免费资源。在我看来,设置 1/100 秒的等待时间并不是那样做。如果您要请求这么多数据,我会在两次请求之间至少等待 30 秒。

我还要补充一点,您可以简化将请求结果保存到 netCDF 文件的过程——不需要通过 xarray,因为从服务器返回的已经是 netCDF 文件:

...
query.accept('netcdf4')
with open('/home/william/GFS_Siphon/2020'+'{:0>2}'.format(month)+'/gfs.0p25.2020'+'{:0>2}'.format(month)+'{:0>2}'.format(day)+"00.f"+'{:0>3}'.format(i)+'.nc', 'wb') as outfile:
    data = ncss.get_data_raw(query)
    outfile.write(data)

0
投票

这个脚本很有帮助。一个小问题:

如何在脚本中加入月份长度/天数(28 日或 30 日或 31 日)?

© www.soinside.com 2019 - 2024. All rights reserved.