Merge specialized to DataTree objects.
(
trees: Sequence[DataTree],
compat: CompatOptions | CombineKwargDefault = _COMPAT_DEFAULT,
join: JoinOptions | CombineKwargDefault = _JOIN_DEFAULT,
fill_value: object = dtypes.NA,
combine_attrs: CombineAttrsOptions = "override",
)
| 801 | |
| 802 | |
| 803 | def merge_trees( |
| 804 | trees: Sequence[DataTree], |
| 805 | compat: CompatOptions | CombineKwargDefault = _COMPAT_DEFAULT, |
| 806 | join: JoinOptions | CombineKwargDefault = _JOIN_DEFAULT, |
| 807 | fill_value: object = dtypes.NA, |
| 808 | combine_attrs: CombineAttrsOptions = "override", |
| 809 | ) -> DataTree: |
| 810 | """Merge specialized to DataTree objects.""" |
| 811 | from xarray.core.dataset import Dataset |
| 812 | from xarray.core.datatree import DataTree |
| 813 | from xarray.core.datatree_mapping import add_path_context_to_errors |
| 814 | |
| 815 | if fill_value is not dtypes.NA: |
| 816 | # fill_value support dicts, which probably should be mapped to sub-groups? |
| 817 | raise NotImplementedError( |
| 818 | "fill_value is not yet supported for DataTree objects in merge" |
| 819 | ) |
| 820 | |
| 821 | node_lists: defaultdict[str, list[DataTree]] = defaultdict(list) |
| 822 | for tree in trees: |
| 823 | for key, node in tree.subtree_with_keys: |
| 824 | node_lists[key].append(node) |
| 825 | |
| 826 | root_datasets = [node.dataset for node in node_lists.pop(".")] |
| 827 | with add_path_context_to_errors("."): |
| 828 | root_ds = merge( |
| 829 | root_datasets, compat=compat, join=join, combine_attrs=combine_attrs |
| 830 | ) |
| 831 | result = DataTree(dataset=root_ds) |
| 832 | |
| 833 | def level(kv): |
| 834 | # all trees with the same path have the same level |
| 835 | _, trees = kv |
| 836 | return trees[0].level |
| 837 | |
| 838 | for key, nodes in sorted(node_lists.items(), key=level): |
| 839 | # Merge datasets, including inherited indexes to ensure alignment. |
| 840 | datasets = [node.dataset for node in nodes] |
| 841 | with add_path_context_to_errors(key): |
| 842 | merge_result = merge_core( |
| 843 | datasets, |
| 844 | compat=compat, |
| 845 | join=join, |
| 846 | combine_attrs=combine_attrs, |
| 847 | ) |
| 848 | merged_ds = Dataset._construct_direct(**merge_result._asdict()) |
| 849 | result[key] = DataTree(dataset=merged_ds) |
| 850 | |
| 851 | return result |
| 852 | |
| 853 | |
| 854 | @overload |
no test coverage detected
searching dependent graphs…