我试图从THREDDS服务器加载netcdf,但在某个时间步长后遇到无法识别的错误。
def list_dates(start, end):
num_days = (end - start).days
return [start + dt.timedelta(days=x) for x in range(num_days)]
start_date = dt.date(2017, 3, 1)
end_date = dt.date(2017, 3, 31)
date_list = list_dates(start_date, end_date)
window = dt.timedelta(days=5)
url = 'https://www.ncei.noaa.gov/thredds/dodsC/OisstBase/NetCDF/V2.0/AVHRR/{0:%Y%m}/avhrr-only-v2.{0:%Y%m%d}.nc'
#url2= 'https://www.ncei.noaa.gov/thredds/dodsC/Datasets/noaa.oisst.v2.highres/icec.day.mean.{0:%Y}.v2.nc'
data = []
cur_date = start_date
for cur_date in date_list:
print(cur_date)
date_window = list_dates(cur_date - window, cur_date + window)
url_list = [url.format(x) for x in date_window]
window_data=xr.open_mfdataset(url_list).sst
data.append(window_data.mean('time'))
print(data[-1])
dataf=xr.concat(data, dim=pd.DatetimeIndex(date_list, name='time'))
print (dataf)在3月22日之前,此数据的加载一直很顺利,这是失败的日期。我尝试过更改月份和年份,每次脚本在第22个时间步失败。碰巧有两个错误代码,我将在下面提供。任何关于这里正在发生的事情的信息都将不胜感激。作为参考,我运行的是最新版本的python和netCDF4,以及xarray。
错误:
错误1:KeyError: [<class 'netCDF4._netCDF4.Dataset'>, ('https://www.ncei.noaa.gov/thredds/dodsC/OisstBase/NetCDF/V2.0/AVHRR/201703/avhrr-only-v2.20170322.nc',), 'r', (('clobber', True), ('diskless', False), ('format', 'NETCDF4'), ('persist', False))]
错误2:OSError: [Errno -37] NetCDF: Write to read only: b'https://www.ncei.noaa.gov/thredds/dodsC/OisstBase/NetCDF/V2.0/AVHRR/201703/avhrr-only-v2.20170322.nc'
发布于 2020-08-12 23:13:51
我不能完全确定潜在的问题是什么,但是在xarray netcdf4缓存和netCDF-C库之间似乎有一些不对劲的地方。如果您在for循环之前添加以下内容:
xr.set_options(file_cache_maxsize=10)这将有助于确保缓存中的任何文件(在本例中是netCDF4.Dataset对象)在您处理完它们时得到清理,并且避免了底层问题(不确定有多长时间,但我将代码从2017-03-01运行到2017-05-31时没有出现错误)。
再说一次,不确定到底发生了什么,但可能值得打开一个github issue with xarray。这在xarray级别上可能不是问题,但它将从那里到达正确的位置。
https://stackoverflow.com/questions/61896920
复制相似问题