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/7197#issuecomment-1288100778,https://api.github.com/repos/pydata/xarray/issues/7197,1288100778,IC_kwDOAMm_X85Mxtuq,1828519,2022-10-23T12:23:07Z,2022-10-23T12:23:07Z,CONTRIBUTOR,Ugh how did I miss that issue. Thanks. I'm fine with closing this since the existing tests have caught it.,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,1419602897 https://github.com/pydata/xarray/issues/7197#issuecomment-1287986325,https://api.github.com/repos/pydata/xarray/issues/7197,1287986325,IC_kwDOAMm_X85MxRyV,1828519,2022-10-23T02:41:14Z,2022-10-23T02:41:14Z,CONTRIBUTOR,"Ah turns out doing `to_netcdf` on that DataArray is good enough: ``` a.to_netcdf(""/tmp/mytest.nc"") ``` to fail:
``` File ~/miniconda3/envs/satpy_py39_unstable/lib/python3.9/site-packages/xarray/core/dataarray.py:3752, in DataArray.to_netcdf(self, path, mode, format, group, engine, encoding, unlimited_dims, compute, invalid_netcdf) 3748 else: 3749 # No problems with the name - so we're fine! 3750 dataset = self.to_dataset() -> 3752 return to_netcdf( # type: ignore # mypy cannot resolve the overloads:( 3753 dataset, 3754 path, 3755 mode=mode, 3756 format=format, 3757 group=group, 3758 engine=engine, 3759 encoding=encoding, 3760 unlimited_dims=unlimited_dims, 3761 compute=compute, 3762 multifile=False, 3763 invalid_netcdf=invalid_netcdf, 3764 ) File ~/miniconda3/envs/satpy_py39_unstable/lib/python3.9/site-packages/xarray/backends/api.py:1230, in to_netcdf(dataset, path_or_file, mode, format, group, engine, encoding, unlimited_dims, compute, multifile, invalid_netcdf) 1225 # TODO: figure out how to refactor this logic (here and in save_mfdataset) 1226 # to avoid this mess of conditionals 1227 try: 1228 # TODO: allow this work (setting up the file for writing array data) 1229 # to be parallelized with dask -> 1230 dump_to_store( 1231 dataset, store, writer, encoding=encoding, unlimited_dims=unlimited_dims 1232 ) 1233 if autoclose: 1234 store.close() File ~/miniconda3/envs/satpy_py39_unstable/lib/python3.9/site-packages/xarray/backends/api.py:1277, in dump_to_store(dataset, store, writer, encoder, encoding, unlimited_dims) 1274 if encoder: 1275 variables, attrs = encoder(variables, attrs) -> 1277 store.store(variables, attrs, check_encoding, writer, unlimited_dims=unlimited_dims) File ~/miniconda3/envs/satpy_py39_unstable/lib/python3.9/site-packages/xarray/backends/common.py:266, in AbstractWritableDataStore.store(self, variables, attributes, check_encoding_set, writer, unlimited_dims) 263 if writer is None: 264 writer = ArrayWriter() --> 266 variables, attributes = self.encode(variables, attributes) 268 self.set_attributes(attributes) 269 self.set_dimensions(variables, unlimited_dims=unlimited_dims) File ~/miniconda3/envs/satpy_py39_unstable/lib/python3.9/site-packages/xarray/backends/common.py:355, in WritableCFDataStore.encode(self, variables, attributes) 352 def encode(self, variables, attributes): 353 # All NetCDF files get CF encoded by default, without this attempting 354 # to write times, for example, would fail. --> 355 variables, attributes = cf_encoder(variables, attributes) 356 variables = {k: self.encode_variable(v) for k, v in variables.items()} 357 attributes = {k: self.encode_attribute(v) for k, v in attributes.items()} File ~/miniconda3/envs/satpy_py39_unstable/lib/python3.9/site-packages/xarray/conventions.py:868, in cf_encoder(variables, attributes) 865 # add encoding for time bounds variables if present. 866 _update_bounds_encoding(variables) --> 868 new_vars = {k: encode_cf_variable(v, name=k) for k, v in variables.items()} 870 # Remove attrs from bounds variables (issue #2921) 871 for var in new_vars.values(): File ~/miniconda3/envs/satpy_py39_unstable/lib/python3.9/site-packages/xarray/conventions.py:868, in (.0) 865 # add encoding for time bounds variables if present. 866 _update_bounds_encoding(variables) --> 868 new_vars = {k: encode_cf_variable(v, name=k) for k, v in variables.items()} 870 # Remove attrs from bounds variables (issue #2921) 871 for var in new_vars.values(): File ~/miniconda3/envs/satpy_py39_unstable/lib/python3.9/site-packages/xarray/conventions.py:273, in encode_cf_variable(var, needs_copy, name) 264 ensure_not_multiindex(var, name=name) 266 for coder in [ 267 times.CFDatetimeCoder(), 268 times.CFTimedeltaCoder(), (...) 271 variables.UnsignedIntegerCoder(), 272 ]: --> 273 var = coder.encode(var, name=name) 275 # TODO(shoyer): convert all of these to use coders, too: 276 var = maybe_encode_nonstring_dtype(var, name=name) File ~/miniconda3/envs/satpy_py39_unstable/lib/python3.9/site-packages/xarray/coding/times.py:676, in CFDatetimeCoder.encode(self, variable, name) 672 dims, data, attrs, encoding = unpack_for_encoding(variable) 673 if np.issubdtype(data.dtype, np.datetime64) or contains_cftime_datetimes( 674 variable 675 ): --> 676 (data, units, calendar) = encode_cf_datetime( 677 data, encoding.pop(""units"", None), encoding.pop(""calendar"", None) 678 ) 679 safe_setitem(attrs, ""units"", units, name=name) 680 safe_setitem(attrs, ""calendar"", calendar, name=name) File ~/miniconda3/envs/satpy_py39_unstable/lib/python3.9/site-packages/xarray/coding/times.py:612, in encode_cf_datetime(dates, units, calendar) 609 dates = np.asarray(dates) 611 if units is None: --> 612 units = infer_datetime_units(dates) 613 else: 614 units = _cleanup_netcdf_time_units(units) File ~/miniconda3/envs/satpy_py39_unstable/lib/python3.9/site-packages/xarray/coding/times.py:394, in infer_datetime_units(dates) 392 print(""Formatting datetime object"") 393 reference_date = dates[0] if len(dates) > 0 else ""1970-01-01"" --> 394 reference_date = format_cftime_datetime(reference_date) 395 unique_timedeltas = np.unique(np.diff(dates)) 396 units = _infer_time_units_from_diff(unique_timedeltas) File ~/miniconda3/envs/satpy_py39_unstable/lib/python3.9/site-packages/xarray/coding/times.py:405, in format_cftime_datetime(date) 400 def format_cftime_datetime(date): 401 """"""Converts a cftime.datetime object to a string with the format: 402 YYYY-MM-DD HH:MM:SS.UUUUUU 403 """""" 404 return ""{:04d}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}.{:06d}"".format( --> 405 date.year, 406 date.month, 407 date.day, 408 date.hour, 409 date.minute, 410 date.second, 411 date.microsecond, 412 ) AttributeError: 'numpy.datetime64' object has no attribute 'year' ```
NOTE: Just because this clearly fails the check in this line: https://github.com/pydata/xarray/blob/6cb97f645475bddf2f3b1e1a5f24f0f9de690683/xarray/coding/times.py#L384 It does not seem to be the only problem from my tests. Using datetime64 objects in various parts of a DataArray seem to cause different errors...I think. I need to do more tests.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,1419602897