Skip to content

Commit 392a614

Browse files
authored
Update DataArray.rename + docu (#6665)
* update dataarray rename incl docu * update whats-new * add support for changing name and dims/coords at the same time * fix runtime typing issue * Revert "add support for changing name and dims/coords at the same time" This reverts commit 31d8521. * enable rename to None again * fix a typing problem
1 parent 8f983f1 commit 392a614

File tree

5 files changed

+103
-25
lines changed

5 files changed

+103
-25
lines changed

doc/whats-new.rst

+3
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,9 @@ Documentation
229229
sizes. In particular, correct the syntax and replace lists with tuples in the
230230
examples. (:issue:`6333`, :pull:`6334`)
231231
By `Stan West <https://github.com/stanwest>`_.
232+
- Mention that ``xr.DataArray.rename`` can rename coordinates.
233+
(:issue:`5458`, :pull:`6665`)
234+
By `Michael Niklas <https://github.com/headtr1ck>`_.
232235

233236
- Added examples to :py:meth:`Dataset.thin` and :py:meth:`DataArray.thin`
234237
By `Emma Marshall <https://github.com/e-marshall>`_.

xarray/core/dataarray.py

+16-11
Original file line numberDiff line numberDiff line change
@@ -1996,17 +1996,17 @@ def rename(
19961996
new_name_or_name_dict: Hashable | Mapping[Any, Hashable] | None = None,
19971997
**names: Hashable,
19981998
) -> DataArray:
1999-
"""Returns a new DataArray with renamed coordinates or a new name.
1999+
"""Returns a new DataArray with renamed coordinates, dimensions or a new name.
20002000
20012001
Parameters
20022002
----------
20032003
new_name_or_name_dict : str or dict-like, optional
20042004
If the argument is dict-like, it used as a mapping from old
2005-
names to new names for coordinates. Otherwise, use the argument
2006-
as the new name for this array.
2005+
names to new names for coordinates or dimensions. Otherwise,
2006+
use the argument as the new name for this array.
20072007
**names : Hashable, optional
20082008
The keyword arguments form of a mapping from old names to
2009-
new names for coordinates.
2009+
new names for coordinates or dimensions.
20102010
One of new_name_or_name_dict or names must be provided.
20112011
20122012
Returns
@@ -2019,16 +2019,21 @@ def rename(
20192019
Dataset.rename
20202020
DataArray.swap_dims
20212021
"""
2022-
if names or utils.is_dict_like(new_name_or_name_dict):
2023-
new_name_or_name_dict = cast(
2024-
Mapping[Hashable, Hashable], new_name_or_name_dict
2025-
)
2022+
if new_name_or_name_dict is None and not names:
2023+
# change name to None?
2024+
return self._replace(name=None)
2025+
if utils.is_dict_like(new_name_or_name_dict) or new_name_or_name_dict is None:
2026+
# change dims/coords
20262027
name_dict = either_dict_or_kwargs(new_name_or_name_dict, names, "rename")
20272028
dataset = self._to_temp_dataset().rename(name_dict)
20282029
return self._from_temp_dataset(dataset)
2029-
else:
2030-
new_name_or_name_dict = cast(Hashable, new_name_or_name_dict)
2031-
return self._replace(name=new_name_or_name_dict)
2030+
if utils.hashable(new_name_or_name_dict) and names:
2031+
# change name + dims/coords
2032+
dataset = self._to_temp_dataset().rename(names)
2033+
dataarray = self._from_temp_dataset(dataset)
2034+
return dataarray._replace(name=new_name_or_name_dict)
2035+
# only change name
2036+
return self._replace(name=new_name_or_name_dict)
20322037

20332038
def swap_dims(
20342039
self: T_DataArray,

xarray/core/dataset.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -3558,12 +3558,12 @@ def rename(
35583558
name_dict: Mapping[Any, Hashable] | None = None,
35593559
**names: Hashable,
35603560
) -> T_Dataset:
3561-
"""Returns a new object with renamed variables and dimensions.
3561+
"""Returns a new object with renamed variables, coordinates and dimensions.
35623562
35633563
Parameters
35643564
----------
35653565
name_dict : dict-like, optional
3566-
Dictionary whose keys are current variable or dimension names and
3566+
Dictionary whose keys are current variable, coordinate or dimension names and
35673567
whose values are the desired names.
35683568
**names : optional
35693569
Keyword form of ``name_dict``.
@@ -3572,7 +3572,7 @@ def rename(
35723572
Returns
35733573
-------
35743574
renamed : Dataset
3575-
Dataset with renamed variables and dimensions.
3575+
Dataset with renamed variables, coordinates and dimensions.
35763576
35773577
See Also
35783578
--------

xarray/core/types.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
InterpOptions = Union[Interp1dOptions, InterpolantOptions]
5757

5858
DatetimeUnitOptions = Literal[
59-
"Y", "M", "W", "D", "h", "m", "s", "ms", "us", "ns", "ps", "fs", "as", None
59+
"Y", "M", "W", "D", "h", "m", "s", "ms", "us", "μs", "ns", "ps", "fs", "as", None
6060
]
6161

6262
QueryEngineOptions = Literal["python", "numexpr", None]

xarray/tests/test_dataarray.py

+80-10
Original file line numberDiff line numberDiff line change
@@ -1653,17 +1653,87 @@ def test_reindex_str_dtype(self, dtype) -> None:
16531653
assert actual.dtype == expected.dtype
16541654

16551655
def test_rename(self) -> None:
1656-
renamed = self.dv.rename("bar")
1657-
assert_identical(renamed.to_dataset(), self.ds.rename({"foo": "bar"}))
1658-
assert renamed.name == "bar"
16591656

1660-
renamed = self.dv.x.rename({"x": "z"}).rename("z")
1661-
assert_identical(renamed, self.ds.rename({"x": "z"}).z)
1662-
assert renamed.name == "z"
1663-
assert renamed.dims == ("z",)
1664-
1665-
renamed_kwargs = self.dv.x.rename(x="z").rename("z")
1666-
assert_identical(renamed, renamed_kwargs)
1657+
da = xr.DataArray(
1658+
[1, 2, 3], dims="dim", name="name", coords={"coord": ("dim", [5, 6, 7])}
1659+
)
1660+
1661+
# change name
1662+
renamed_name = da.rename("name_new")
1663+
assert renamed_name.name == "name_new"
1664+
expected_name = da.copy()
1665+
expected_name.name = "name_new"
1666+
assert_identical(renamed_name, expected_name)
1667+
1668+
# change name to None?
1669+
renamed_noname = da.rename(None)
1670+
assert renamed_noname.name is None
1671+
expected_noname = da.copy()
1672+
expected_noname.name = None
1673+
assert_identical(renamed_noname, expected_noname)
1674+
renamed_noname = da.rename()
1675+
assert renamed_noname.name is None
1676+
assert_identical(renamed_noname, expected_noname)
1677+
1678+
# change dim
1679+
renamed_dim = da.rename({"dim": "dim_new"})
1680+
assert renamed_dim.dims == ("dim_new",)
1681+
expected_dim = xr.DataArray(
1682+
[1, 2, 3],
1683+
dims="dim_new",
1684+
name="name",
1685+
coords={"coord": ("dim_new", [5, 6, 7])},
1686+
)
1687+
assert_identical(renamed_dim, expected_dim)
1688+
1689+
# change dim with kwargs
1690+
renamed_dimkw = da.rename(dim="dim_new")
1691+
assert renamed_dimkw.dims == ("dim_new",)
1692+
assert_identical(renamed_dimkw, expected_dim)
1693+
1694+
# change coords
1695+
renamed_coord = da.rename({"coord": "coord_new"})
1696+
assert "coord_new" in renamed_coord.coords
1697+
expected_coord = xr.DataArray(
1698+
[1, 2, 3], dims="dim", name="name", coords={"coord_new": ("dim", [5, 6, 7])}
1699+
)
1700+
assert_identical(renamed_coord, expected_coord)
1701+
1702+
# change coords with kwargs
1703+
renamed_coordkw = da.rename(coord="coord_new")
1704+
assert "coord_new" in renamed_coordkw.coords
1705+
assert_identical(renamed_coordkw, expected_coord)
1706+
1707+
# change coord and dim
1708+
renamed_both = da.rename({"dim": "dim_new", "coord": "coord_new"})
1709+
assert renamed_both.dims == ("dim_new",)
1710+
assert "coord_new" in renamed_both.coords
1711+
expected_both = xr.DataArray(
1712+
[1, 2, 3],
1713+
dims="dim_new",
1714+
name="name",
1715+
coords={"coord_new": ("dim_new", [5, 6, 7])},
1716+
)
1717+
assert_identical(renamed_both, expected_both)
1718+
1719+
# change coord and dim with kwargs
1720+
renamed_bothkw = da.rename(dim="dim_new", coord="coord_new")
1721+
assert renamed_bothkw.dims == ("dim_new",)
1722+
assert "coord_new" in renamed_bothkw.coords
1723+
assert_identical(renamed_bothkw, expected_both)
1724+
1725+
# change all
1726+
renamed_all = da.rename("name_new", dim="dim_new", coord="coord_new")
1727+
assert renamed_all.name == "name_new"
1728+
assert renamed_all.dims == ("dim_new",)
1729+
assert "coord_new" in renamed_all.coords
1730+
expected_all = xr.DataArray(
1731+
[1, 2, 3],
1732+
dims="dim_new",
1733+
name="name_new",
1734+
coords={"coord_new": ("dim_new", [5, 6, 7])},
1735+
)
1736+
assert_identical(renamed_all, expected_all)
16671737

16681738
def test_init_value(self) -> None:
16691739
expected = DataArray(

0 commit comments

Comments
 (0)