id,node_id,number,title,user,state,locked,assignee,milestone,comments,created_at,updated_at,closed_at,author_association,active_lock_reason,draft,pull_request,body,reactions,performed_via_github_app,state_reason,repo,type 412180435,MDU6SXNzdWU0MTIxODA0MzU=,2780,Automatic dtype encoding in to_netcdf,43126798,open,0,,,4,2019-02-19T23:56:48Z,2022-04-28T19:01:34Z,,CONTRIBUTOR,,,,"#### Code Sample, a copy-pastable example if possible Example from https://stackoverflow.com/questions/49053692/csv-to-netcdf-produces-nc-files-4x-larger-than-the-original-csv ```{python} import pandas as pd import xarray as xr import numpy as np import os # Create pandas DataFrame df = pd.DataFrame(np.random.randint(low=0, high=10, size=(100000,5)), columns=['a', 'b', 'c', 'd', 'e']) # Make 'e' a column of strings df['e'] = df['e'].astype(str) # Save to csv df.to_csv('df.csv') # Convert to an xarray's Dataset ds = xr.Dataset.from_dataframe(df) # Save NetCDF file ds.to_netcdf('ds.nc') # Compute stats stats1 = os.stat('df.csv') stats2 = os.stat('ds.nc') print('csv=',str(stats1.st_size)) print('nc =',str(stats2.st_size)) print('nc/csv=',str(stats2.st_size/stats1.st_size)) ``` The result: ``` >>> csv = 1688902 bytes >>> nc = 6432441 bytes >>> nc/csv = 3.8086526038811015 ``` #### Problem description NetCDF can store numerical data, as well as some other data, such as categorical data, in a much more efficient way than CSV, do to it's ability to store numbers (integers, limited precision floats) in smaller encodings (e.g. 8 bit integers), as well as it's ability to compress data using zlib. The answers in the stack exchange link at the top of the page give some examples of how this can be done. The second one is particularly useful, and it would be nice if xarray provided an `encoding={'dtype': 'auto'}` option to automatically select the most compact dtype able to store a given DataArray before saving the file. #### Expected Output NetCDF from should be equal to or smaller than a CSV full of numerical data in most cases. #### Output of ``xr.show_versions()``
``` INSTALLED VERSIONS ------------------ commit: None python: 3.6.7 | packaged by conda-forge | (default, Nov 21 2018, 03:09:43) [GCC 7.3.0] python-bits: 64 OS: Linux OS-release: 4.18.0-15-generic machine: x86_64 processor: x86_64 byteorder: little LC_ALL: None LANG: en_AU.UTF-8 LOCALE: en_AU.UTF-8 libhdf5: 1.10.4 libnetcdf: 4.6.2 xarray: 0.11.3 pandas: 0.24.1 netCDF4: 1.4.2 h5netcdf: 0.6.2 h5py: 2.9.0 dask: 1.0.0 ```
","{""url"": ""https://api.github.com/repos/pydata/xarray/issues/2780/reactions"", ""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,,13221727,issue 366626025,MDU6SXNzdWUzNjY2MjYwMjU=,2461,Set one-dimensional data variable as dimension coordinate?,43126798,closed,0,,,13,2018-10-04T05:19:25Z,2019-11-21T23:57:15Z,2018-10-04T06:22:03Z,CONTRIBUTOR,,,,"#### Code Sample I have this dataset, and I'd like to make it indexable by time: ```python Dimensions: (station_observations: 46862) Dimensions without coordinates: station_observations Data variables: time (station_observations) datetime64[ns] ... SNOW_ON_THE_GROUND (station_observations) float64 ... ONE_DAY_SNOW (station_observations) float64 ... ONE_DAY_RAIN (station_observations) float64 ... ONE_DAY_PRECIPITATION (station_observations) float64 ... MIN_TEMP (station_observations) float64 ... MAX_TEMP (station_observations) float64 ... Attributes: elevation: 15.0 ``` #### Problem description I expected to be able to use `ds.set_coords` to make the `time` variable an indexable coordinate. The variable IS converted to a coordinate, but it is not a dimension coordinate, so I can't index with it. I can use `assign_coords(station_observations=ds.time)` to make station_observations indexable by time, but then the name in semantically wrong, and the `time` variable still exists, which makes the code harder to maintain. #### Expected Output ```python ds.set_coords('time', inplace=True) Dimensions: (station_observations: 46862) Coordinates: time (station_observations) datetime64[ns] ... Dimensions without coordinates: station_observations Data variables: SNOW_ON_THE_GROUND (station_observations) float64 ... ONE_DAY_SNOW (station_observations) float64 ... ONE_DAY_RAIN (station_observations) float64 ... ONE_DAY_PRECIPITATION (station_observations) float64 ... MIN_TEMP (station_observations) float64 ... MAX_TEMP (station_observations) float64 ... Attributes: elevation: 15.0 In [95]: ds.sel(time='1896') ValueError: dimensions or multi-index levels ['time'] do not exist ``` with assign_coords: ```python In [97]: ds=ds.assign_coords(station_observations=ds.time) In [98]: ds.sel(station_observations='1896') Out[98]: Dimensions: (station_observations: 366) Coordinates: * station_observations (station_observations) datetime64[ns] 1896-01-01 ... Data variables: time (station_observations) datetime64[ns] ... SNOW_ON_THE_GROUND (station_observations) float64 ... ONE_DAY_SNOW (station_observations) float64 ... ONE_DAY_RAIN (station_observations) float64 ... ONE_DAY_PRECIPITATION (station_observations) float64 ... MIN_TEMP (station_observations) float64 ... MAX_TEMP (station_observations) float64 ... Attributes: elevation: 15.0 ``` works correctly, but looks ugly. It would be nice if the time variable could be assigned as a dimension directly. I can drop the time variable and rename the station_observations, but it's a little annoying to do so. #### Output of ``xr.show_versions()``
INSTALLED VERSIONS ------------------ commit: None python: 3.6.6.final.0 python-bits: 64 OS: Linux OS-release: 4.16.0-041600-generic machine: x86_64 processor: x86_64 byteorder: little LC_ALL: None LANG: en_AU.UTF-8 LOCALE: en_AU.UTF-8 xarray: 0.10.2 pandas: 0.22.0 numpy: 1.13.3 scipy: 0.19.1 netCDF4: 1.3.1 h5netcdf: None h5py: None Nio: None zarr: None bottleneck: 1.2.0 cyordereddict: None dask: 0.16.0 distributed: None matplotlib: 2.1.1 cartopy: None seaborn: None setuptools: 39.0.1 pip: 9.0.1 conda: None pytest: None IPython: 5.5.0 sphinx: None
","{""url"": ""https://api.github.com/repos/pydata/xarray/issues/2461/reactions"", ""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,completed,13221727,issue 456769766,MDU6SXNzdWU0NTY3Njk3NjY=,3026,Rename dims independently from coords?,43126798,closed,0,,,11,2019-06-17T06:48:40Z,2019-07-02T20:24:55Z,2019-07-02T20:24:55Z,CONTRIBUTOR,,,,"I have a dataset that looks like this: ```python Dimensions: (lat: 226, lon: 261, time: 7300) Coordinates: * lat (lat) float32 -32.0 -31.9 -31.8 -31.7 ... -9.700001 -9.6 -9.5 * lon (lon) float32 132.0 132.1 132.2 132.3 ... 157.7 157.8 157.9 158.0 * time (time) object 1980-01-01 15:00:00 ... 1999-12-31 15:00:00 Data variables: rnd24 (time, lat, lon) float32 ... ``` #### Problem description I would like to be able to rename the dataset dimensions, *without renaming the coordinates*. #### Expected Output ```python Dimensions: (y: 226, x: 261, time: 7300) Coordinates: * lat (y) float32 -32.0 -31.9 -31.8 -31.7 ... -9.700001 -9.6 -9.5 * lon (x) float32 132.0 132.1 132.2 132.3 ... 157.7 157.8 157.9 158.0 * time (time) object 1980-01-01 15:00:00 ... 1999-12-31 15:00:00 Data variables: rnd24 (time, y, x) float32 ... ``` As far as I can tell, there is no way to do this. I can `rename` the existing dims/coords to x/y, and then manually create new coordinates that are copies of x and y, which gets me to: ```python Dimensions: (time: 7300, x: 261, y: 226) Coordinates: * y (y) float32 -32.0 -31.9 -31.8 -31.7 ... -9.700001 -9.6 -9.5 * x (x) float32 132.0 132.1 132.2 132.3 ... 157.7 157.8 157.9 158.0 * time (time) object 1980-01-01 15:00:00 ... 1999-12-31 15:00:00 lat (y) float32 -32.0 -31.9 -31.8 -31.7 ... -9.700001 -9.6 -9.5 lon (x) float32 132.0 132.1 132.2 132.3 ... 157.7 157.8 157.9 158.0 Data variables: rnd24 (time, y, x) float32 ... ``` But it doesn't seem to be possible to re-assign the new coordinates as the indexes for the existing dims. In this case, it may seem a bit redundant, because the coordinates are equal to the grid. But I'm trying to get this output to work with code that also deals with other datasets that have non- rectilinear grids.","{""url"": ""https://api.github.com/repos/pydata/xarray/issues/3026/reactions"", ""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,completed,13221727,issue 366711310,MDExOlB1bGxSZXF1ZXN0MjIwMzE2NjY2,2463,Add swap_coords to relevant 'See also' sections,43126798,closed,0,,,3,2018-10-04T09:58:16Z,2018-10-23T05:55:45Z,2018-10-23T05:55:34Z,CONTRIBUTOR,,0,pydata/xarray/pulls/2463,"Minor documentation additions. - [ ] Closes #2461 ","{""url"": ""https://api.github.com/repos/pydata/xarray/issues/2463/reactions"", ""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,,13221727,pull 371845469,MDExOlB1bGxSZXF1ZXN0MjI0MTk5OTc1,2493,Include multidimensional stacking groupby in docs,43126798,closed,0,,,1,2018-10-19T07:55:15Z,2018-10-23T00:25:45Z,2018-10-23T00:25:35Z,CONTRIBUTOR,,0,pydata/xarray/pulls/2493,Include short example of multidimensional stack-groupby-apply-unstack methodology.,"{""url"": ""https://api.github.com/repos/pydata/xarray/issues/2493/reactions"", ""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,,13221727,pull