html_url,issue_url,id,node_id,user,created_at,updated_at,author_association,body,reactions,performed_via_github_app,issue https://github.com/pydata/xarray/issues/6069#issuecomment-1033814820,https://api.github.com/repos/pydata/xarray/issues/6069,1033814820,IC_kwDOAMm_X849nsMk,43613877,2022-02-09T14:23:54Z,2022-02-09T14:36:48Z,CONTRIBUTOR,"You are right, the coordinates should not be dropped. I think the function [_validate_region](https://github.com/pydata/xarray/blob/39860f9bd3ed4e84a5d694adda10c82513ed519f/xarray/backends/api.py#L1244) has a bug. Currently it checks for all `ds.variables` if at least one of their dimensions agrees with the ones given in the region argument. However, `ds.variables` also returns the [coordinates](https://xarray.pydata.org/en/stable/generated/xarray.Dataset.variables.html). However, we actually only want to check if the `ds.data_vars` have a dimension intersecting with the given `region`. Changing the function to ```python def _validate_region(ds, region): if not isinstance(region, dict): raise TypeError(f""``region`` must be a dict, got {type(region)}"") for k, v in region.items(): if k not in ds.dims: raise ValueError( f""all keys in ``region`` are not in Dataset dimensions, got "" f""{list(region)} and {list(ds.dims)}"" ) if not isinstance(v, slice): raise TypeError( ""all values in ``region`` must be slice objects, got "" f""region={region}"" ) if v.step not in {1, None}: raise ValueError( ""step on all slices in ``region`` must be 1 or None, got "" f""region={region}"" ) non_matching_vars = [ k for k, v in ds.data_vars.items() if not set(region).intersection(v.dims) ] if non_matching_vars: raise ValueError( f""when setting `region` explicitly in to_zarr(), all "" f""variables in the dataset to write must have at least "" f""one dimension in common with the region's dimensions "" f""{list(region.keys())}, but that is not "" f""the case for some variables here. To drop these variables "" f""from this dataset before exporting to zarr, write: "" f"".drop({non_matching_vars!r})"" ) ``` seems to work.","{""total_count"": 1, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 1, ""eyes"": 0}",,1077079208 https://github.com/pydata/xarray/issues/6069#issuecomment-1031773761,https://api.github.com/repos/pydata/xarray/issues/6069,1031773761,IC_kwDOAMm_X849f55B,43613877,2022-02-07T18:19:08Z,2022-02-07T18:19:08Z,CONTRIBUTOR,"Hi @Boorhin, I just ran into the same issue. The `region` argument has to be of type `slice`, in your case `slice(t)` instead of just `t` works: ```python import xarray as xr from datetime import datetime,timedelta import numpy as np dt= datetime.now() times= np.arange(dt,dt+timedelta(days=6), timedelta(hours=1)) nodesx,nodesy,layers=np.arange(10,50), np.arange(10,50)+15, np.arange(10) ds=xr.Dataset() ds.coords['time']=('time', times) ds.coords['node_x']=('node', nodesx) ds.coords['node_y']=('node', nodesy) ds.coords['layer']=('layer', layers) outfile='my_zarr' varnames=['potato','banana', 'apple'] for var in varnames: ds[var]=(('time', 'layer', 'node'), np.zeros((len(times), len(layers),len(nodesx)))) ds.to_zarr(outfile, mode='a') for t in range(len(times)): for var in varnames: ds[var].isel(time=slice(t)).values += np.random.random((len(layers),len(nodesx))) ds.isel(time=slice(t)).to_zarr(outfile, region={""time"": slice(t)}) ``` This leads however to another issue: ```python --------------------------------------------------------------------------- ValueError Traceback (most recent call last) in 18 for var in varnames: 19 ds[var].isel(time=slice(t)).values += np.random.random((len(layers),len(nodesx))) ---> 20 ds.isel(time=slice(t)).to_zarr(outfile, region={""time"": slice(t)}) ~/.local/lib/python3.8/site-packages/xarray/core/dataset.py in to_zarr(self, store, chunk_store, mode, synchronizer, group, encoding, compute, consolidated, append_dim, region, safe_chunks) 2029 encoding = {} 2030 -> 2031 return to_zarr( 2032 self, 2033 store=store, ~/.local/lib/python3.8/site-packages/xarray/backends/api.py in to_zarr(dataset, store, chunk_store, mode, synchronizer, group, encoding, compute, consolidated, append_dim, region, safe_chunks) 1359 1360 if region is not None: -> 1361 _validate_region(dataset, region) 1362 if append_dim is not None and append_dim in region: 1363 raise ValueError( ~/.local/lib/python3.8/site-packages/xarray/backends/api.py in _validate_region(ds, region) 1272 ] 1273 if non_matching_vars: -> 1274 raise ValueError( 1275 f""when setting `region` explicitly in to_zarr(), all "" 1276 f""variables in the dataset to write must have at least "" ValueError: when setting `region` explicitly in to_zarr(), all variables in the dataset to write must have at least one dimension in common with the region's dimensions ['time'], but that is not the case for some variables here. To drop these variables from this dataset before exporting to zarr, write: .drop(['node_x', 'node_y', 'layer']) ``` Here, the solution is however provided with the error message. Following the instructions, the snippet below finally works (as far as I can tell): ```python import xarray as xr from datetime import datetime,timedelta import numpy as np dt= datetime.now() times= np.arange(dt,dt+timedelta(days=6), timedelta(hours=1)) nodesx,nodesy,layers=np.arange(10,50), np.arange(10,50)+15, np.arange(10) ds=xr.Dataset() ds.coords['time']=('time', times) # ds.coords['node_x']=('node', nodesx) # ds.coords['node_y']=('node', nodesy) # ds.coords['layer']=('layer', layers) outfile='my_zarr' varnames=['potato','banana', 'apple'] for var in varnames: ds[var]=(('time', 'layer', 'node'), np.zeros((len(times), len(layers),len(nodesx)))) ds.to_zarr(outfile, mode='a') for t in range(len(times)): for var in varnames: ds[var].isel(time=slice(t)).values += np.random.random((len(layers),len(nodesx))) ds.isel(time=slice(t)).to_zarr(outfile, region={""time"": slice(t)}) ``` Maybe one would like to generalise `region` in `api.py` to allow for single indices or throw a hint in case an a type different to a slice is provided. Cheers","{""total_count"": 1, ""+1"": 1, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,1077079208