home / github / issue_comments

Menu
  • GraphQL API
  • Search all tables

issue_comments: 854786005

This data as json

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/5436#issuecomment-854786005 https://api.github.com/repos/pydata/xarray/issues/5436 854786005 MDEyOklzc3VlQ29tbWVudDg1NDc4NjAwNQ== 14808389 2021-06-04T14:48:49Z 2021-06-04T14:58:08Z MEMBER

It sounds like we should try to add a page to the user-guide section of the docs explaining what combine_attrs (and keep_attrs) do.

When merging an object, all the attrs of the objects to be merge (i.e. all Dataset / DataArray objects that were passed, and separately all variables with the same name) will be passed to a function which does the merging of the attrs. combine_attrs="drop" always makes it return an empty dict while "override" always returns the first attrs dict from the list of dicts it was passed. "drop_conflicts" will go through all those dicts and keeps only those attributes where the values don't mismatch. In other words: that's by design, we simply changed the rules to also apply them to the variables. For examples of how they work:

comparison of the different values for <tt>combine_attrs</tt> ```python In [6]: ds1 = xr.Dataset(attrs={"created": "2020-06-05", "a": 0}) ...: ds2 = xr.Dataset(attrs={"created": "2021-06-05", "b": 1}) ...: ...: xr.merge([ds1, ds2], combine_attrs="drop") Out[6]: <xarray.Dataset> Dimensions: () Data variables: *empty* In [7]: ds1 = xr.Dataset(attrs={"created": "2020-06-05", "a": 0}) ...: ds2 = xr.Dataset(attrs={"created": "2021-06-05", "b": 1}) ...: ...: xr.merge([ds1, ds2], combine_attrs="override") Out[7]: <xarray.Dataset> Dimensions: () Data variables: *empty* Attributes: created: 2020-06-05 a: 0 In [8]: ds1 = xr.Dataset(attrs={"created": "2020-06-05", "a": 0}) ...: ds2 = xr.Dataset(attrs={"created": "2020-06-05", "b": 1}) ...: ...: xr.merge([ds1, ds2], combine_attrs="no_conflicts") Out[8]: <xarray.Dataset> Dimensions: () Data variables: *empty* Attributes: created: 2020-06-05 a: 0 b: 1 In [9]: ds1 = xr.Dataset(attrs={"created": "2020-06-05", "a": 0}) ...: ds2 = xr.Dataset(attrs={"created": "2021-06-05", "b": 1}) ...: ...: xr.merge([ds1, ds2], combine_attrs="identical") --------------------------------------------------------------------------- MergeError Traceback (most recent call last) <ipython-input-9-3fda11a2986d> in <module> 2 ds2 = xr.Dataset(attrs={"created": "2021-06-05", "b": 1}) 3 ----> 4 xr.merge([ds1, ds2], combine_attrs="identical") .../xarray/core/merge.py in merge(objects, compat, join, fill_value, combine_attrs) 883 dict_like_objects.append(obj) 884 --> 885 merge_result = merge_core( 886 dict_like_objects, 887 compat, .../xarray/core/merge.py in merge_core(objects, compat, join, combine_attrs, priority_arg, explicit_coords, indexes, fill_value) 645 ) 646 --> 647 attrs = merge_attrs( 648 [var.attrs for var in coerced if isinstance(var, (Dataset, DataArray))], 649 combine_attrs, .../xarray/core/merge.py in merge_attrs(variable_attrs, combine_attrs) 546 for attrs in variable_attrs[1:]: 547 if not dict_equiv(result, attrs): --> 548 raise MergeError( 549 f"combine_attrs='identical', but attrs differ. First is {str(result)} " 550 f", other is {str(attrs)}." MergeError: combine_attrs='identical', but attrs differ. First is {'created': '2020-06-05', 'a': 0} , other is {'created': '2021-06-05', 'b': 1}. In [10]: ds1 = xr.Dataset(attrs={"created": "2020-06-05", "a": 0}) ...: ds2 = xr.Dataset(attrs={"created": "2021-06-05", "b": 1}) ...: ...: xr.merge([ds1, ds2], combine_attrs="drop_conflicts") Out[10]: <xarray.Dataset> Dimensions: () Data variables: *empty* Attributes: a: 0 b: 1 ```

What I was referring to before was something different: ```python In [2]: arr = xr.DataArray([0, 1], dims="x", attrs={"units": "m"}) ...: arr Out[2]: <xarray.DataArray (x: 2)> array([0, 1]) Dimensions without coordinates: x Attributes: units: m

In [3]: arr.to_dataset(name="a") Out[3]: <xarray.Dataset> Dimensions: (x: 2) Dimensions without coordinates: x Data variables: a (x) int64 0 1

In [4]: arr.to_dataset(name="a", promote_attrs=True) Out[4]: <xarray.Dataset> Dimensions: (x: 2) Dimensions without coordinates: x Data variables: a (x) int64 0 1 Attributes: units: m `` why doesxr.mergeconvert withpromote_attrs=True`?

(I do not understand your comment: how to keep the units on the data instead of in the attributes ?)

have a look at pint-xarray for that (still experimental, but I very much welcome feedback)

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
  911513701
Powered by Datasette · Queries took 0.763ms · About: xarray-datasette