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/2292#issuecomment-979759002,https://api.github.com/repos/pydata/xarray/issues/2292,979759002,IC_kwDOAMm_X846Ze-a,25172489,2021-11-26T07:48:21Z,2021-11-26T07:52:42Z,NONE,"Would like to chime in that we use a similar approach as in the last comment of @DerWeh . But we extend this by overloading the `__str__` method of the `enum.Enum` base class, and implement a `Dimension` base class to use for our enum dimensions: ``` class Dimension(str, enum.Enum): """"""Base class for all dimension enums It is of type string because this is needed for xarray. """""" def __str__(self): return type(self).__name__ + ""."" + self.name ``` Using this the xarray output is more consistent: ``` >>> class CoordId(Dimension): ... LAT = 'lat' ... LON = 'lon' ... >>> xr.DataArray( ... data=np.arange(3 * 2).reshape(3, 2), ... coords={CoordId.LAT: [1, 2, 3], CoordId.LON: [7, 8]}, ... dims=[CoordId.LAT, CoordId.LON], ... ) array([[0, 1], [2, 3], [4, 5]]) Coordinates: * CoordId.LAT (CoordId.LAT) int64 1 2 3 * CoordId.LON (CoordId.LON) int64 7 8 ``` We then have deserialization code, that re-creates enum members when reading NetCDF files with corresponding dimensions (and coordinates). Access to coordinates works with enum members as well as their string value.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,341643235 https://github.com/pydata/xarray/issues/2292#issuecomment-722565840,https://api.github.com/repos/pydata/xarray/issues/2292,722565840,MDEyOklzc3VlQ29tbWVudDcyMjU2NTg0MA==,22542812,2020-11-05T18:41:24Z,2020-11-05T18:41:24Z,NONE,"I just came along this question as I tried something similar to @joshburkart. Using a string-enum instead, the code works in principle: ```python import enum import numpy as np import pandas as pd import xarray as xr class CoordId(str, enum.Enum): LAT = 'lat' LON = 'lon' pd.DataFrame({CoordId.LAT: [1,2,3]}).to_csv() # Returns: ',CoordId.LAT\n0,1\n1,2\n2,3\n' xr.DataArray( data=np.arange(3 * 2).reshape(3, 2), coords={CoordId.LAT: [1, 2, 3], CoordId.LON: [7, 8]}, dims=[CoordId.LAT, CoordId.LON], ) # output # # array([[0, 1], # [2, 3], # [4, 5]]) # Coordinates: # * lat (CoordId.LAT) int64 1 2 3 # * lon (CoordId.LON) int64 7 8 ``` We however got somewhat ambivalent results, that the dimensions are still enum elements `dims = (, )`, but the coordinate names are the strings. After writing and reading the `DataArray`, everything is a plain string, we can still access the elements using the enum elements, as they are equal to the strings.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,341643235 https://github.com/pydata/xarray/issues/2292#issuecomment-406617353,https://api.github.com/repos/pydata/xarray/issues/2292,406617353,MDEyOklzc3VlQ29tbWVudDQwNjYxNzM1Mw==,3888181,2018-07-20T14:28:07Z,2018-07-20T14:28:07Z,NONE,"Just to clarify @shoyer, you said (2) sounds best to you, but your other comments (e.g. duck typing, requiring hashable) seem to describe (1)...? Slightly confused...","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,341643235 https://github.com/pydata/xarray/issues/2292#issuecomment-406356945,https://api.github.com/repos/pydata/xarray/issues/2292,406356945,MDEyOklzc3VlQ29tbWVudDQwNjM1Njk0NQ==,3888181,2018-07-19T17:37:34Z,2018-07-19T17:37:34Z,NONE,"Some options that come to mind: 1. Allow any object with a `__str__` method to be supplied as a variable/dimension label, but then delegate all internal sorting/printing/etc. logic to `str(label)`. 2. Just implicitly run `str` on everything a user tries to input as a label (both when creating an `xarray` object and when accessing fields from an existing object), so that only strings are used internally. 3. Put this on the user, and only allow calling `xarray` objects/methods/etc. with labels already strings, as you suggested @shoyer. I dunno. Whatever the maintainers think is best? (3) seems least complex on the `xarray` side, but (1) or (2) might be more convenient for users.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,341643235 https://github.com/pydata/xarray/issues/2292#issuecomment-405380136,https://api.github.com/repos/pydata/xarray/issues/2292,405380136,MDEyOklzc3VlQ29tbWVudDQwNTM4MDEzNg==,3888181,2018-07-16T20:59:13Z,2018-07-16T20:59:13Z,NONE,Thanks @shoyer. I'll see if I can take a look in the near future...,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,341643235