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/4822#issuecomment-1081886061,https://api.github.com/repos/pydata/xarray/issues/4822,1081886061,IC_kwDOAMm_X85AfEVt,2448579,2022-03-29T13:39:45Z,2022-03-29T13:39:45Z,MEMBER,"Thanks @kmuehlbauer . @yt87 please reopen if you still have trouble after upgrading `h5netcdf`","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,787947436 https://github.com/pydata/xarray/issues/4822#issuecomment-1081745934,https://api.github.com/repos/pydata/xarray/issues/4822,1081745934,IC_kwDOAMm_X85AeiIO,5821660,2022-03-29T11:20:44Z,2022-03-29T11:20:44Z,MEMBER,@yt87 This works for me with latest `h5netcdf` version. There have been several fixes regarding attribute reading. The issue might be closed after confirming.,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,787947436 https://github.com/pydata/xarray/issues/4822#issuecomment-762725640,https://api.github.com/repos/pydata/xarray/issues/4822,762725640,MDEyOklzc3VlQ29tbWVudDc2MjcyNTY0MA==,5821660,2021-01-19T09:43:53Z,2021-01-19T09:43:53Z,MEMBER,"Possibly related issue: https://github.com/h5netcdf/h5netcdf/issues/27 Anyway, I think I've found the root-cause of the issue. So with netcdf4-python it is possible to specify writing of attributes as `NC_STRING` string attributes. The following will create a netcdf file which is readable with current xarray and `h5netcdf` backend. ```python import netCDF4 as nc import xarray as xr rootgrp = nc.Dataset(""test_nc4_attrs.nc"", mode=""w"", format=""NETCDF4"") # rootgrp.set_ncstring_attrs(True) x = rootgrp.createDimension(""x"", 1) y = rootgrp.createDimension(""y"", 1) foo = rootgrp.createVariable(""foo"", ""i4"", (""y"", ""x"")) foo.coordinates = ""y x"" foo[0, 0] = 0 rootgrp.close() ds = xr.open_dataset(""test_nc4_attrs.nc"", engine=""h5netcdf"") print(ds) print(ds.foo) ds.close() ``` If you uncomment the one line, this creates netcdf file which breaks with the error @yt87 showed above. If you try to open the file with `decode_cf=False` and write it back using `to_netcdf` the same error occurs. h5dump before uncomment ``` ATTRIBUTE ""coordinates"" { DATATYPE H5T_STRING { STRSIZE 3; STRPAD H5T_STR_NULLTERM; CSET H5T_CSET_ASCII; CTYPE H5T_C_S1; } DATASPACE SCALAR DATA { (0): ""y x"" } } ``` h5dump after uncomment ``` ATTRIBUTE ""coordinates"" { DATATYPE H5T_STRING { STRSIZE H5T_VARIABLE; STRPAD H5T_STR_NULLTERM; CSET H5T_CSET_UTF8; CTYPE H5T_C_S1; } DATASPACE SIMPLE { ( 1 ) / ( 1 ) } DATA { (0): ""y x"" } } ``` Another thing I found, that this only accounts for `coordinate` attributes. All other attributes are read correctly AFAIKT. So with this in mind I would consider that a bug. The assumption that attributes are always scalar doesn't hold true. And one more thing, also roundtripping in netcdf4 does not keep the NC_STRING type: ```python import netCDF4 as nc import xarray as xr rootgrp = nc.Dataset(""test_nc4_attrs.nc"", mode=""w"", format=""NETCDF4"") rootgrp.set_ncstring_attrs(True) x = rootgrp.createDimension(""x"", 1) y = rootgrp.createDimension(""y"", 1) foo = rootgrp.createVariable(""foo"", ""i4"", (""y"", ""x"")) rootgrp.coordinates = ""z y x"" foo.coordinates = ""y x"" foo[0, 0] = 0 rootgrp.close() ds = xr.open_dataset(""test_nc4_attrs.nc"", engine=""netcdf4"") ds.to_netcdf(""test_nc4_attrs_out.nc"") ds.close() ``` ``` ncdump test_nc4_attrs.nc netcdf test_nc4_attrs { dimensions: x = 1 ; y = 1 ; variables: int foo(y, x) ; string foo:coordinates = ""y x"" ; // global attributes: string :coordinates = ""z y x"" ; data: foo = 0 ; } ``` ``` ncdump test_nc4_attrs_out.nc netcdf test_nc4_attrs_out { dimensions: y = 1 ; x = 1 ; variables: int foo(y, x) ; foo:coordinates = ""y x"" ; data: foo = 0 ; } ``` So changes are needed in several places to check if the attribute is scalar or array, not only for `coordinates` attributes. Thoughts? ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,787947436 https://github.com/pydata/xarray/issues/4822#issuecomment-762429899,https://api.github.com/repos/pydata/xarray/issues/4822,762429899,MDEyOklzc3VlQ29tbWVudDc2MjQyOTg5OQ==,5821660,2021-01-18T19:18:22Z,2021-01-18T19:18:22Z,MEMBER,"@yt87 Thanks for providing all this. Could you please give `-k 'nc4'` as option to the call to ncgen and report back? I think this is a problem with data model. ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,787947436 https://github.com/pydata/xarray/issues/4822#issuecomment-762400927,https://api.github.com/repos/pydata/xarray/issues/4822,762400927,MDEyOklzc3VlQ29tbWVudDc2MjQwMDkyNw==,5821660,2021-01-18T18:07:27Z,2021-01-18T18:07:27Z,MEMBER,"If you want a quick fix to read the file, add kwarg `decode_cf=False` in `open_dataset`. Then fix the coordinate attribute and call `xr.decode_cf(ds)`.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,787947436 https://github.com/pydata/xarray/issues/4822#issuecomment-762396972,https://api.github.com/repos/pydata/xarray/issues/4822,762396972,MDEyOklzc3VlQ29tbWVudDc2MjM5Njk3Mg==,5821660,2021-01-18T17:58:07Z,2021-01-18T17:58:07Z,MEMBER,"Hmm, this worked in my case. How exactly did you create the netcdf file? ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,787947436 https://github.com/pydata/xarray/issues/4822#issuecomment-762258597,https://api.github.com/repos/pydata/xarray/issues/4822,762258597,MDEyOklzc3VlQ29tbWVudDc2MjI1ODU5Nw==,5821660,2021-01-18T13:42:20Z,2021-01-18T13:42:20Z,MEMBER,"@yt87 AFAIK the CDL doesn't declare attribute types specifically. This should work: ``` netcdf x { dimensions: x = 1 ; y = 1 ; variables: int foo(y, x) ; foo:coordinates = ""x y"" ; data: foo = 0 ; } ```","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,787947436