Closed EliT1626 closed 4 years ago
Code Sample
xr.set_options(file_cache_maxsize=10)
# Assumes daily increments
def list_dates(start, end):
num_days = (end - start).days
return [start + dt.timedelta(days=x) for x in range(num_days)]
def list_dates1(start, end):
num_days = (end - start).days
dates = [start + dt.timedelta(days=x) for x in range(num_days)]
sorted_dates = sorted(dates, key=lambda date: (date.month, date.day))
grouped_dates = [list(g) for _, g in groupby(sorted_dates, key=lambda date: (date.month, date.day))]
return grouped_dates
start_date = dt.date(2010, 1, 1)
end_date = dt.date(2019, 12, 31)
date_list = list_dates1(start_date, end_date)
window1 = dt.timedelta(days=5)
window2 = dt.timedelta(days=6)
url = 'https://www.ncei.noaa.gov/thredds/dodsC/OisstBase/NetCDF/V2.1/AVHRR/{0:%Y%m}/oisst-avhrr-v02r01.{0:%Y%m%d}.nc'
end_date2 = dt.date(2010, 1, 2)
sst_mean=[]
cur_date = start_date
for cur_date in date_list:
sst_mean_calc = []
for i in cur_date:
date_window=list_dates(i - window1, i + window2)
url_list_window = [url.format(x) for x in date_window]
window_data=xr.open_mfdataset(url_list_window).sst
sst_mean_calc.append(window_data.mean('time'))
sst_mean.append(xr.concat(sst_mean_calc, dim='time').mean('time'))
cur_date+=cur_date
if cur_date[0] >= end_date2:
break
else:
continue
sst_mean_climo_test=xr.concat(sst_mean, dim='time')
#sst_std=xr.concat(sst_std_calc, dim=pd.DatetimeIndex(date_list, name='time'))
#sst_min = xr.concat(sst_min_calc, dim=pd.DatetimeIndex(date_list, name='time'))
#sst_max = xr.concat(sst_max_calc, dim=pd.DatetimeIndex(date_list, name='time'))
sst_mean_climo_test.to_netcdf(path='E:/Riskpulse_HD/SST_stuff/sst_mean_climo_test')
Explanation of Code This code (climatology for SSTs) creates a list of dates between the specified start and end dates that contains the same day number for every month through the year span. For example, date_list[0] contains 10 datetime dates that start with 1-1-2010, 1-1-2011...1-1-2019. I then request OISST data from an opendap server and take a centered mean of the date in question (this case I did it for the first and second of January). In other words, I am opening the files for Dec 27-Jan 6 and averaging all of them together. The final xarray dataset then contains two 'times', which is 10 years worth of data for Jan 1 and Jan 2. I want to then send this to a netcdf file such that I can save it on my local machine and use to create plots down the road. Hope this makes sense.
Error Messages
KeyError Traceback (most recent call last)
~\Anaconda3\lib\site-packages\xarray\backends\file_manager.py in _acquire_with_cache_info(self, needs_lock)
197 try:
--> 198 file = self._cache[self._key]
199 except KeyError:
~\Anaconda3\lib\site-packages\xarray\backends\lru_cache.py in __getitem__(self, key)
52 with self._lock:
---> 53 value = self._cache[key]
54 self._cache.move_to_end(key)
KeyError: [<class 'netCDF4._netCDF4.Dataset'>, ('https://www.ncei.noaa.gov/thredds/dodsC/OisstBase/NetCDF/V2.1/AVHRR/201801/oisst-avhrr-v02r01.20180106.nc',), 'r', (('clobber', True), ('diskless', False), ('format', 'NETCDF4'), ('persist', False))]
During handling of the above exception, another exception occurred:
RuntimeError Traceback (most recent call last)
<ipython-input-3-f8395dcffb5e> in <module>
1 #xr.set_options(file_cache_maxsize=500)
----> 2 sst_mean_climo_test.to_netcdf(path='E:/Riskpulse_HD/SST_stuff/sst_mean_climo_test')
~\Anaconda3\lib\site-packages\xarray\core\dataarray.py in to_netcdf(self, *args, **kwargs)
2356 dataset = self.to_dataset()
2357
-> 2358 return dataset.to_netcdf(*args, **kwargs)
2359
2360 def to_dict(self, data: bool = True) -> dict:
~\Anaconda3\lib\site-packages\xarray\core\dataset.py in to_netcdf(self, path, mode, format, group, engine, encoding, unlimited_dims, compute, invalid_netcdf)
1552 unlimited_dims=unlimited_dims,
1553 compute=compute,
-> 1554 invalid_netcdf=invalid_netcdf,
1555 )
1556
~\Anaconda3\lib\site-packages\xarray\backends\api.py in to_netcdf(dataset, path_or_file, mode, format, group, engine, encoding, unlimited_dims, compute, multifile, invalid_netcdf)
1095 return writer, store
1096
-> 1097 writes = writer.sync(compute=compute)
1098
1099 if path_or_file is None:
~\Anaconda3\lib\site-packages\xarray\backends\common.py in sync(self, compute)
202 compute=compute,
203 flush=True,
--> 204 regions=self.regions,
205 )
206 self.sources = []
~\Anaconda3\lib\site-packages\dask\array\core.py in store(sources, targets, lock, regions, compute, return_stored, **kwargs)
943
944 if compute:
--> 945 result.compute(**kwargs)
946 return None
947 else:
~\Anaconda3\lib\site-packages\dask\base.py in compute(self, **kwargs)
164 dask.base.compute
165 """
--> 166 (result,) = compute(self, traverse=False, **kwargs)
167 return result
168
~\Anaconda3\lib\site-packages\dask\base.py in compute(*args, **kwargs)
442 postcomputes.append(x.__dask_postcompute__())
443
--> 444 results = schedule(dsk, keys, **kwargs)
445 return repack([f(r, *a) for r, (f, a) in zip(results, postcomputes)])
446
~\Anaconda3\lib\site-packages\dask\threaded.py in get(dsk, result, cache, num_workers, pool, **kwargs)
82 get_id=_thread_get_id,
83 pack_exception=pack_exception,
---> 84 **kwargs
85 )
86
~\Anaconda3\lib\site-packages\dask\local.py in get_async(apply_async, num_workers, dsk, result, cache, get_id, rerun_exceptions_locally, pack_exception, raise_exception, callbacks, dumps, loads, **kwargs)
484 _execute_task(task, data) # Re-execute locally
485 else:
--> 486 raise_exception(exc, tb)
487 res, worker_id = loads(res_info)
488 state["cache"][key] = res
~\Anaconda3\lib\site-packages\dask\local.py in reraise(exc, tb)
314 if exc.__traceback__ is not tb:
315 raise exc.with_traceback(tb)
--> 316 raise exc
317
318
~\Anaconda3\lib\site-packages\dask\local.py in execute_task(key, task_info, dumps, loads, get_id, pack_exception)
220 try:
221 task, data = loads(task_info)
--> 222 result = _execute_task(task, data)
223 id = get_id()
224 result = dumps((result, id))
~\Anaconda3\lib\site-packages\dask\core.py in _execute_task(arg, cache, dsk)
119 # temporaries by their reference count and can execute certain
120 # operations in-place.
--> 121 return func(*(_execute_task(a, cache) for a in args))
122 elif not ishashable(arg):
123 return arg
~\Anaconda3\lib\site-packages\dask\array\core.py in getter(a, b, asarray, lock)
98 c = a[b]
99 if asarray:
--> 100 c = np.asarray(c)
101 finally:
102 if lock:
~\Anaconda3\lib\site-packages\numpy\core\_asarray.py in asarray(a, dtype, order)
83
84 """
---> 85 return array(a, dtype, copy=False, order=order)
86
87
~\Anaconda3\lib\site-packages\xarray\core\indexing.py in __array__(self, dtype)
489
490 def __array__(self, dtype=None):
--> 491 return np.asarray(self.array, dtype=dtype)
492
493 def __getitem__(self, key):
~\Anaconda3\lib\site-packages\numpy\core\_asarray.py in asarray(a, dtype, order)
83
84 """
---> 85 return array(a, dtype, copy=False, order=order)
86
87
~\Anaconda3\lib\site-packages\xarray\core\indexing.py in __array__(self, dtype)
651
652 def __array__(self, dtype=None):
--> 653 return np.asarray(self.array, dtype=dtype)
654
655 def __getitem__(self, key):
~\Anaconda3\lib\site-packages\numpy\core\_asarray.py in asarray(a, dtype, order)
83
84 """
---> 85 return array(a, dtype, copy=False, order=order)
86
87
~\Anaconda3\lib\site-packages\xarray\core\indexing.py in __array__(self, dtype)
555 def __array__(self, dtype=None):
556 array = as_indexable(self.array)
--> 557 return np.asarray(array[self.key], dtype=None)
558
559 def transpose(self, order):
~\Anaconda3\lib\site-packages\numpy\core\_asarray.py in asarray(a, dtype, order)
83
84 """
---> 85 return array(a, dtype, copy=False, order=order)
86
87
~\Anaconda3\lib\site-packages\xarray\coding\variables.py in __array__(self, dtype)
70
71 def __array__(self, dtype=None):
---> 72 return self.func(self.array)
73
74 def __repr__(self):
~\Anaconda3\lib\site-packages\xarray\coding\variables.py in _scale_offset_decoding(data, scale_factor, add_offset, dtype)
216
217 def _scale_offset_decoding(data, scale_factor, add_offset, dtype):
--> 218 data = np.array(data, dtype=dtype, copy=True)
219 if scale_factor is not None:
220 data *= scale_factor
~\Anaconda3\lib\site-packages\xarray\coding\variables.py in __array__(self, dtype)
70
71 def __array__(self, dtype=None):
---> 72 return self.func(self.array)
73
74 def __repr__(self):
~\Anaconda3\lib\site-packages\xarray\coding\variables.py in _apply_mask(data, encoded_fill_values, decoded_fill_value, dtype)
136 ) -> np.ndarray:
137 """Mask all matching values in a NumPy arrays."""
--> 138 data = np.asarray(data, dtype=dtype)
139 condition = False
140 for fv in encoded_fill_values:
~\Anaconda3\lib\site-packages\numpy\core\_asarray.py in asarray(a, dtype, order)
83
84 """
---> 85 return array(a, dtype, copy=False, order=order)
86
87
~\Anaconda3\lib\site-packages\xarray\core\indexing.py in __array__(self, dtype)
555 def __array__(self, dtype=None):
556 array = as_indexable(self.array)
--> 557 return np.asarray(array[self.key], dtype=None)
558
559 def transpose(self, order):
~\Anaconda3\lib\site-packages\xarray\backends\netCDF4_.py in __getitem__(self, key)
71 def __getitem__(self, key):
72 return indexing.explicit_indexing_adapter(
---> 73 key, self.shape, indexing.IndexingSupport.OUTER, self._getitem
74 )
75
~\Anaconda3\lib\site-packages\xarray\core\indexing.py in explicit_indexing_adapter(key, shape, indexing_support, raw_indexing_method)
835 """
836 raw_key, numpy_indices = decompose_indexer(key, shape, indexing_support)
--> 837 result = raw_indexing_method(raw_key.tuple)
838 if numpy_indices.tuple:
839 # index the loaded np.ndarray
~\Anaconda3\lib\site-packages\xarray\backends\netCDF4_.py in _getitem(self, key)
82 try:
83 with self.datastore.lock:
---> 84 original_array = self.get_array(needs_lock=False)
85 array = getitem(original_array, key)
86 except IndexError:
~\Anaconda3\lib\site-packages\xarray\backends\netCDF4_.py in get_array(self, needs_lock)
61
62 def get_array(self, needs_lock=True):
---> 63 ds = self.datastore._acquire(needs_lock)
64 variable = ds.variables[self.variable_name]
65 variable.set_auto_maskandscale(False)
~\Anaconda3\lib\site-packages\xarray\backends\netCDF4_.py in _acquire(self, needs_lock)
359
360 def _acquire(self, needs_lock=True):
--> 361 with self._manager.acquire_context(needs_lock) as root:
362 ds = _nc4_require_group(root, self._group, self._mode)
363 return ds
~\Anaconda3\lib\contextlib.py in __enter__(self)
110 del self.args, self.kwds, self.func
111 try:
--> 112 return next(self.gen)
113 except StopIteration:
114 raise RuntimeError("generator didn't yield") from None
~\Anaconda3\lib\site-packages\xarray\backends\file_manager.py in acquire_context(self, needs_lock)
184 def acquire_context(self, needs_lock=True):
185 """Context manager for acquiring a file."""
--> 186 file, cached = self._acquire_with_cache_info(needs_lock)
187 try:
188 yield file
~\Anaconda3\lib\site-packages\xarray\backends\file_manager.py in _acquire_with_cache_info(self, needs_lock)
206 # ensure file doesn't get overriden when opened again
207 self._mode = "a"
--> 208 self._cache[self._key] = file
209 return file, False
210 else:
~\Anaconda3\lib\site-packages\xarray\backends\lru_cache.py in __setitem__(self, key, value)
71 elif self._maxsize:
72 # make room if necessary
---> 73 self._enforce_size_limit(self._maxsize - 1)
74 self._cache[key] = value
75 elif self._on_evict is not None:
~\Anaconda3\lib\site-packages\xarray\backends\lru_cache.py in _enforce_size_limit(self, capacity)
61 key, value = self._cache.popitem(last=False)
62 if self._on_evict is not None:
---> 63 self._on_evict(key, value)
64
65 def __setitem__(self, key: K, value: V) -> None:
~\Anaconda3\lib\site-packages\xarray\backends\file_manager.py in <lambda>(k, v)
12 # Global cache for storing open files.
13 FILE_CACHE: LRUCache[str, io.IOBase] = LRUCache(
---> 14 maxsize=cast(int, OPTIONS["file_cache_maxsize"]), on_evict=lambda k, v: v.close()
15 )
16 assert FILE_CACHE.maxsize, "file cache must be at least size one"
netCDF4\_netCDF4.pyx in netCDF4._netCDF4.Dataset.close()
netCDF4\_netCDF4.pyx in netCDF4._netCDF4.Dataset._close()
netCDF4\_netCDF4.pyx in netCDF4._netCDF4._ensure_nc_success()
RuntimeError: NetCDF: HDF error
I also tried changing setting xr.set_options(file_cache_maxsize=500)
outside of the loop before trying to create the netcdf file and received this error:
KeyError Traceback (most recent call last)
~\Anaconda3\lib\site-packages\xarray\backends\file_manager.py in _acquire_with_cache_info(self, needs_lock)
197 try:
--> 198 file = self._cache[self._key]
199 except KeyError:
~\Anaconda3\lib\site-packages\xarray\backends\lru_cache.py in __getitem__(self, key)
52 with self._lock:
---> 53 value = self._cache[key]
54 self._cache.move_to_end(key)
KeyError: [<class 'netCDF4._netCDF4.Dataset'>, ('https://www.ncei.noaa.gov/thredds/dodsC/OisstBase/NetCDF/V2.1/AVHRR/201512/oisst-avhrr-v02r01.20151231.nc',), 'r', (('clobber', True), ('diskless', False), ('format', 'NETCDF4'), ('persist', False))]
During handling of the above exception, another exception occurred:
OSError Traceback (most recent call last)
<ipython-input-4-474cdce51e60> in <module>
1 xr.set_options(file_cache_maxsize=500)
----> 2 sst_mean_climo_test.to_netcdf(path='E:/Riskpulse_HD/SST_stuff/sst_mean_climo_test')
~\Anaconda3\lib\site-packages\xarray\core\dataarray.py in to_netcdf(self, *args, **kwargs)
2356 dataset = self.to_dataset()
2357
-> 2358 return dataset.to_netcdf(*args, **kwargs)
2359
2360 def to_dict(self, data: bool = True) -> dict:
~\Anaconda3\lib\site-packages\xarray\core\dataset.py in to_netcdf(self, path, mode, format, group, engine, encoding, unlimited_dims, compute, invalid_netcdf)
1552 unlimited_dims=unlimited_dims,
1553 compute=compute,
-> 1554 invalid_netcdf=invalid_netcdf,
1555 )
1556
~\Anaconda3\lib\site-packages\xarray\backends\api.py in to_netcdf(dataset, path_or_file, mode, format, group, engine, encoding, unlimited_dims, compute, multifile, invalid_netcdf)
1095 return writer, store
1096
-> 1097 writes = writer.sync(compute=compute)
1098
1099 if path_or_file is None:
~\Anaconda3\lib\site-packages\xarray\backends\common.py in sync(self, compute)
202 compute=compute,
203 flush=True,
--> 204 regions=self.regions,
205 )
206 self.sources = []
~\Anaconda3\lib\site-packages\dask\array\core.py in store(sources, targets, lock, regions, compute, return_stored, **kwargs)
943
944 if compute:
--> 945 result.compute(**kwargs)
946 return None
947 else:
~\Anaconda3\lib\site-packages\dask\base.py in compute(self, **kwargs)
164 dask.base.compute
165 """
--> 166 (result,) = compute(self, traverse=False, **kwargs)
167 return result
168
~\Anaconda3\lib\site-packages\dask\base.py in compute(*args, **kwargs)
442 postcomputes.append(x.__dask_postcompute__())
443
--> 444 results = schedule(dsk, keys, **kwargs)
445 return repack([f(r, *a) for r, (f, a) in zip(results, postcomputes)])
446
~\Anaconda3\lib\site-packages\dask\threaded.py in get(dsk, result, cache, num_workers, pool, **kwargs)
82 get_id=_thread_get_id,
83 pack_exception=pack_exception,
---> 84 **kwargs
85 )
86
~\Anaconda3\lib\site-packages\dask\local.py in get_async(apply_async, num_workers, dsk, result, cache, get_id, rerun_exceptions_locally, pack_exception, raise_exception, callbacks, dumps, loads, **kwargs)
484 _execute_task(task, data) # Re-execute locally
485 else:
--> 486 raise_exception(exc, tb)
487 res, worker_id = loads(res_info)
488 state["cache"][key] = res
~\Anaconda3\lib\site-packages\dask\local.py in reraise(exc, tb)
314 if exc.__traceback__ is not tb:
315 raise exc.with_traceback(tb)
--> 316 raise exc
317
318
~\Anaconda3\lib\site-packages\dask\local.py in execute_task(key, task_info, dumps, loads, get_id, pack_exception)
220 try:
221 task, data = loads(task_info)
--> 222 result = _execute_task(task, data)
223 id = get_id()
224 result = dumps((result, id))
~\Anaconda3\lib\site-packages\dask\core.py in _execute_task(arg, cache, dsk)
119 # temporaries by their reference count and can execute certain
120 # operations in-place.
--> 121 return func(*(_execute_task(a, cache) for a in args))
122 elif not ishashable(arg):
123 return arg
~\Anaconda3\lib\site-packages\dask\array\core.py in getter(a, b, asarray, lock)
98 c = a[b]
99 if asarray:
--> 100 c = np.asarray(c)
101 finally:
102 if lock:
~\Anaconda3\lib\site-packages\numpy\core\_asarray.py in asarray(a, dtype, order)
83
84 """
---> 85 return array(a, dtype, copy=False, order=order)
86
87
~\Anaconda3\lib\site-packages\xarray\core\indexing.py in __array__(self, dtype)
489
490 def __array__(self, dtype=None):
--> 491 return np.asarray(self.array, dtype=dtype)
492
493 def __getitem__(self, key):
~\Anaconda3\lib\site-packages\numpy\core\_asarray.py in asarray(a, dtype, order)
83
84 """
---> 85 return array(a, dtype, copy=False, order=order)
86
87
~\Anaconda3\lib\site-packages\xarray\core\indexing.py in __array__(self, dtype)
651
652 def __array__(self, dtype=None):
--> 653 return np.asarray(self.array, dtype=dtype)
654
655 def __getitem__(self, key):
~\Anaconda3\lib\site-packages\numpy\core\_asarray.py in asarray(a, dtype, order)
83
84 """
---> 85 return array(a, dtype, copy=False, order=order)
86
87
~\Anaconda3\lib\site-packages\xarray\core\indexing.py in __array__(self, dtype)
555 def __array__(self, dtype=None):
556 array = as_indexable(self.array)
--> 557 return np.asarray(array[self.key], dtype=None)
558
559 def transpose(self, order):
~\Anaconda3\lib\site-packages\numpy\core\_asarray.py in asarray(a, dtype, order)
83
84 """
---> 85 return array(a, dtype, copy=False, order=order)
86
87
~\Anaconda3\lib\site-packages\xarray\coding\variables.py in __array__(self, dtype)
70
71 def __array__(self, dtype=None):
---> 72 return self.func(self.array)
73
74 def __repr__(self):
~\Anaconda3\lib\site-packages\xarray\coding\variables.py in _scale_offset_decoding(data, scale_factor, add_offset, dtype)
216
217 def _scale_offset_decoding(data, scale_factor, add_offset, dtype):
--> 218 data = np.array(data, dtype=dtype, copy=True)
219 if scale_factor is not None:
220 data *= scale_factor
~\Anaconda3\lib\site-packages\xarray\coding\variables.py in __array__(self, dtype)
70
71 def __array__(self, dtype=None):
---> 72 return self.func(self.array)
73
74 def __repr__(self):
~\Anaconda3\lib\site-packages\xarray\coding\variables.py in _apply_mask(data, encoded_fill_values, decoded_fill_value, dtype)
136 ) -> np.ndarray:
137 """Mask all matching values in a NumPy arrays."""
--> 138 data = np.asarray(data, dtype=dtype)
139 condition = False
140 for fv in encoded_fill_values:
~\Anaconda3\lib\site-packages\numpy\core\_asarray.py in asarray(a, dtype, order)
83
84 """
---> 85 return array(a, dtype, copy=False, order=order)
86
87
~\Anaconda3\lib\site-packages\xarray\core\indexing.py in __array__(self, dtype)
555 def __array__(self, dtype=None):
556 array = as_indexable(self.array)
--> 557 return np.asarray(array[self.key], dtype=None)
558
559 def transpose(self, order):
~\Anaconda3\lib\site-packages\xarray\backends\netCDF4_.py in __getitem__(self, key)
71 def __getitem__(self, key):
72 return indexing.explicit_indexing_adapter(
---> 73 key, self.shape, indexing.IndexingSupport.OUTER, self._getitem
74 )
75
~\Anaconda3\lib\site-packages\xarray\core\indexing.py in explicit_indexing_adapter(key, shape, indexing_support, raw_indexing_method)
835 """
836 raw_key, numpy_indices = decompose_indexer(key, shape, indexing_support)
--> 837 result = raw_indexing_method(raw_key.tuple)
838 if numpy_indices.tuple:
839 # index the loaded np.ndarray
~\Anaconda3\lib\site-packages\xarray\backends\netCDF4_.py in _getitem(self, key)
82 try:
83 with self.datastore.lock:
---> 84 original_array = self.get_array(needs_lock=False)
85 array = getitem(original_array, key)
86 except IndexError:
~\Anaconda3\lib\site-packages\xarray\backends\netCDF4_.py in get_array(self, needs_lock)
61
62 def get_array(self, needs_lock=True):
---> 63 ds = self.datastore._acquire(needs_lock)
64 variable = ds.variables[self.variable_name]
65 variable.set_auto_maskandscale(False)
~\Anaconda3\lib\site-packages\xarray\backends\netCDF4_.py in _acquire(self, needs_lock)
359
360 def _acquire(self, needs_lock=True):
--> 361 with self._manager.acquire_context(needs_lock) as root:
362 ds = _nc4_require_group(root, self._group, self._mode)
363 return ds
~\Anaconda3\lib\contextlib.py in __enter__(self)
110 del self.args, self.kwds, self.func
111 try:
--> 112 return next(self.gen)
113 except StopIteration:
114 raise RuntimeError("generator didn't yield") from None
~\Anaconda3\lib\site-packages\xarray\backends\file_manager.py in acquire_context(self, needs_lock)
184 def acquire_context(self, needs_lock=True):
185 """Context manager for acquiring a file."""
--> 186 file, cached = self._acquire_with_cache_info(needs_lock)
187 try:
188 yield file
~\Anaconda3\lib\site-packages\xarray\backends\file_manager.py in _acquire_with_cache_info(self, needs_lock)
202 kwargs = kwargs.copy()
203 kwargs["mode"] = self._mode
--> 204 file = self._opener(*self._args, **kwargs)
205 if self._mode == "w":
206 # ensure file doesn't get overriden when opened again
netCDF4\_netCDF4.pyx in netCDF4._netCDF4.Dataset.__init__()
netCDF4\_netCDF4.pyx in netCDF4._netCDF4._ensure_nc_success()
OSError: [Errno -37] NetCDF: Write to read only: b'https://www.ncei.noaa.gov/thredds/dodsC/OisstBase/NetCDF/V2.1/AVHRR/201512/oisst-avhrr-v02r01.20151231.nc'
I believe these errors have something to do with a post that I created a couple weeks ago (https://github.com/pydata/xarray/issues/4082).
I'm not sure if you can @ users on here, but @rsignell-usgs found out something about the caching before hand. It seems that this is some sort of Windows issue.
Versions python: 3.7.4 xarray: 0.15.1 pandas: 1.0.3 numpy: 1.18.1 scipy: 1.4.1 netcdf4: 1.4.2
MCVE Code Sample
Expected Output
Problem Description
Versions
Output of xr.show_versions()