Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python xarray在遍历opendap数据集时给出HDF错误_Python_Python Xarray_Netcdf4 - Fatal编程技术网

Python xarray在遍历opendap数据集时给出HDF错误

Python xarray在遍历opendap数据集时给出HDF错误,python,python-xarray,netcdf4,Python,Python Xarray,Netcdf4,我试图在Windows10上使用xarray和Python3.7从OpenDAP服务器下载一些数据,遍历一系列站点和年份,并编写本地文件。下面的一个简单示例使用了其中的两个,但对我来说可能会失败: import xarray as xr stations = ["pxsc1","obxc1"] for station in stations: for year in ["2019","2020"]:

我试图在Windows10上使用xarray和Python3.7从OpenDAP服务器下载一些数据,遍历一系列站点和年份,并编写本地文件。下面的一个简单示例使用了其中的两个,但对我来说可能会失败:

import xarray as xr
stations = ["pxsc1","obxc1"]
for station in stations:
    for year in ["2019","2020"]: 
        print(f"Working on station: {station} year: {year}")
        ndbc_url  = f"http://dods.ndbc.noaa.gov/thredds/dodsC/data/stdmet/{station}/{station}h{year}.nc"
        print(ndbc_url)
        fileout = "noaa_stdmet_{}_{}.nc".format(station,year)
        print(fileout)
        with xr.open_dataset(ndbc_url, engine='netcdf4') as remote:
            remote.to_netcdf(fileout,format="NETCDF4_CLASSIC")
第一个例子看起来不错,然后我得到如下所示的HDF错误。
HDF5\u USE\u FILE\u LOCKING
的值似乎不会影响行为。。。我真的不明白这个限制,但我已经试过了。还有其他方法可以让它工作吗

Working on station: pxsc1 year: 2019
http://dods.ndbc.noaa.gov/thredds/dodsC/data/stdmet/pxsc1/pxsc1h2019.nc
noaa_stdmet_pxsc1_2019.nc
Working on station: pxsc1 year: 2020
http://dods.ndbc.noaa.gov/thredds/dodsC/data/stdmet/pxsc1/pxsc1h2020.nc
noaa_stdmet_pxsc1_2020.nc
Traceback (most recent call last):
  File "F:\atmospheric\noaa\ndbc_xarray2.py", line 57, in <module>
    ndbc_opendap()
  File "F:\atmospheric\noaa\ndbc_xarray2.py", line 54, in ndbc_opendap
    remote.to_netcdf(fileout,format="NETCDF4")
  File "C:\Users\eli\miniconda3\envs\schimpy_env\lib\site-packages\xarray\core\common.py", line 1499, in __exit__
    self.close()
  File "C:\Users\eli\miniconda3\envs\schimpy_env\lib\site-packages\xarray\core\common.py", line 1294, in close
    self._close()
  File "C:\Users\eli\miniconda3\envs\schimpy_env\lib\site-packages\xarray\backends\netCDF4_.py", line 512, in close
    self._manager.close(**kwargs)
  File "C:\Users\eli\miniconda3\envs\schimpy_env\lib\site-packages\xarray\backends\file_manager.py", line 222, in close
    file.close()
  File "netCDF4\_netCDF4.pyx", line 2276, in netCDF4._netCDF4.Dataset.close
  File "netCDF4\_netCDF4.pyx", line 2260, in netCDF4._netCDF4.Dataset._close
  File "netCDF4\_netCDF4.pyx", line 1754, in netCDF4._netCDF4._ensure_nc_success
RuntimeError: NetCDF: HDF error

 
站上作业:pxsc1年:2019年
http://dods.ndbc.noaa.gov/thredds/dodsC/data/stdmet/pxsc1/pxsc1h2019.nc
noaa\U stdmet\U pxsc1\U 2019.nc
站上作业:pxsc1年:2020年
http://dods.ndbc.noaa.gov/thredds/dodsC/data/stdmet/pxsc1/pxsc1h2020.nc
美国国家海洋和大气管理局标准气象台pxsc1\U 2020.nc
回溯(最近一次呼叫最后一次):
文件“F:\atmospheric\noaa\ndbcxarray2.py”,第57行,在
ndbc_opendap()
文件“F:\atmospheric\noaa\ndbc_xarray2.py”,第54行,在ndbc_opendap中
远程.to_netcdf(fileout,format=“NETCDF4”)
文件“C:\Users\eli\miniconda3\envs\schimpy\u env\lib\site packages\xarray\core\common.py”,第1499行,在退出时__
self.close()
文件“C:\Users\eli\miniconda3\envs\schimpy\u env\lib\site packages\xarray\core\common.py”,第1294行,关闭
self.\u close()
文件“C:\Users\eli\miniconda3\envs\schimpy\u env\lib\site packages\xarray\backends\netCDF4\uuz.py”,第512行,关闭
自我管理器关闭(**kwargs)
文件“C:\Users\eli\miniconda3\envs\schimpy\u env\lib\site packages\xarray\backends\File\u manager.py”,第222行,关闭
file.close()文件
文件“netCDF4\\ u netCDF4.pyx”,第2276行,在netCDF4中。\ u netCDF4.Dataset.close
文件“netCDF4\\u netCDF4.pyx”,第2260行,位于netCDF4.\u netCDF4.Dataset.\u关闭
文件“netCDF4\\u netCDF4.pyx”,第1754行,在netCDF4中。\u netCDF4.\u确保\u nc\u成功
运行时错误:NetCDF:HDF错误

您的代码似乎没有问题,因为在我的电脑上一切正常:

Working on station: pxsc1 year: 2019
http://dods.ndbc.noaa.gov/thredds/dodsC/data/stdmet/pxsc1/pxsc1h2019.nc
noaa_stdmet_pxsc1_2019.nc
Working on station: pxsc1 year: 2020
http://dods.ndbc.noaa.gov/thredds/dodsC/data/stdmet/pxsc1/pxsc1h2020.nc
noaa_stdmet_pxsc1_2020.nc
Working on station: obxc1 year: 2019
http://dods.ndbc.noaa.gov/thredds/dodsC/data/stdmet/obxc1/obxc1h2019.nc
noaa_stdmet_obxc1_2019.nc
Working on station: obxc1 year: 2020
http://dods.ndbc.noaa.gov/thredds/dodsC/data/stdmet/obxc1/obxc1h2020.nc
noaa_stdmet_obxc1_2020.nc
然而,我认为这是因为计算能力有限。我假设Python仍然存储了第一个数组(它工作得非常好),但是没有足够的内存来存储第二个数组。这就是为什么它返回
RuntimeError
,并可能重新启动内核(?)

尝试在with语句末尾添加
remote.close()
。这可能会解决问题

是否需要使用
NETCDF4\u CLASSIC
?我更喜欢使用
NETCDF4
,据我所知,这更常见(?)。我怀疑这会解决你的问题,但你可以试试

在下面的示例中,您的代码有一个稍加修改的版本:

import xarray as xr 

stations = ['pxsc1', 'obxc1']
year = [str(x) for x in range(2019,2020+1,1)]

url_base = 'http://dods.ndbc.noaa.gov/thredds/dodsC/data/stdmet/'
files_in = [f"{url_base}{s}/{s}h{y}.nc" for s in stations for y in year]
files_out = [f"noaa_stdmet_{s}_{y}.nc" for s in stations for y in year]

def load(file, fileout):
    print(f"open file: {file}")
    with xr.open_dataset(file, engine='netcdf4') as remote:
        print(f"writing file: {fileout}")
        remote.to_netcdf(fileout, format="NETCDF4")
        remote.close()

for fin, fout in list(zip(files_in, files_out)):
    load(fin,fout)

这适用于
engine='pydap'
。在我宣布答案之前,我会看看其他人是否有任何补充。对我来说,NETCDF与NETCDF_CLASSIC并不重要。我之所以使用_CLASSIC,是因为我使用的一些API想要保证没有组。另一个评论是,我不认为close()是
with
语句中的最佳实践。即使退出不优雅,资源也会自动关闭,但可能存在不完整或错误实现的异常。不过,我感谢您尝试它,因为很明显,不管发生了什么(图书馆的糟糕时刻或我的网络的一些事情),都不能概括。