From fa516058f3ea27f5d5064d44fb4a77525fe7c159 Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Wed, 18 Jan 2023 16:24:38 +0100 Subject: [PATCH 1/3] use relative paths for the copied descendants --- datatree/datatree.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/datatree/datatree.py b/datatree/datatree.py index 9a416d8f..bf873a1f 100644 --- a/datatree/datatree.py +++ b/datatree/datatree.py @@ -667,7 +667,8 @@ def _copy_subtree( """Copy entire subtree""" new_tree = self._copy_node(deep=deep) for node in self.descendants: - new_tree[node.path] = node._copy_node(deep=deep) + path = node.relative_to(self) + new_tree[path] = node._copy_node(deep=deep) return new_tree def _copy_node( From 1eeb429f7ef9ea771d11b72efbf00d2c751d8686 Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Wed, 18 Jan 2023 16:29:40 +0100 Subject: [PATCH 2/3] check that copying subtrees works --- datatree/tests/test_datatree.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/datatree/tests/test_datatree.py b/datatree/tests/test_datatree.py index 35307f2a..1c31bacd 100644 --- a/datatree/tests/test_datatree.py +++ b/datatree/tests/test_datatree.py @@ -259,6 +259,14 @@ def test_copy(self, create_test_datatree): assert "foo" not in node.attrs assert node.attrs["Test"] is copied_node.attrs["Test"] + def test_copy_subtree(self): + dt = DataTree.from_dict({"/level1/level2/level3": xr.Dataset()}) + + actual = dt["/level1/level2"].copy() + expected = DataTree.from_dict({"/level3": xr.Dataset()}, name="level2") + + dtt.assert_identical(actual, expected) + def test_deepcopy(self, create_test_datatree): dt = create_test_datatree() From 6f29a23f23ce527257d67212e3c485c51019bc22 Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Wed, 18 Jan 2023 16:36:46 +0100 Subject: [PATCH 3/3] changelog --- docs/source/whats-new.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/source/whats-new.rst b/docs/source/whats-new.rst index f4295bb4..63c0b758 100644 --- a/docs/source/whats-new.rst +++ b/docs/source/whats-new.rst @@ -36,6 +36,8 @@ Bug fixes - Allow for altering of given dataset inside function called by :py:func:`map_over_subtree` (:issue:`188`, :pull:`194`). By `Tom Nicholas `_. +- copy subtrees without creating ancestor nodes (:pull:`201`) + By `Justus Magin `_. Documentation ~~~~~~~~~~~~~