|
8 | 8 | import numpy as np
|
9 | 9 | import pandas as pd
|
10 | 10 | import pytest
|
| 11 | +from pandas.core.indexes.datetimes import DatetimeIndex |
11 | 12 |
|
12 | 13 | import xarray as xr
|
13 | 14 | from xarray import (
|
|
22 | 23 | open_dataset,
|
23 | 24 | set_options,
|
24 | 25 | )
|
| 26 | +from xarray.coding.cftimeindex import CFTimeIndex |
25 | 27 | from xarray.core import dtypes, indexing, utils
|
26 | 28 | from xarray.core.common import duck_array_ops, full_like
|
27 | 29 | from xarray.core.npcompat import IS_NEP18_ACTIVE
|
@@ -2458,6 +2460,53 @@ def test_rename_vars(self):
|
2458 | 2460 | with pytest.raises(ValueError):
|
2459 | 2461 | original.rename_vars(names_dict_bad)
|
2460 | 2462 |
|
| 2463 | + @requires_cftime |
| 2464 | + def test_rename_does_not_change_CFTimeIndex_type(self): |
| 2465 | + # make sure CFTimeIndex is not converted to DatetimeIndex #3522 |
| 2466 | + |
| 2467 | + time = xr.cftime_range(start="2000", periods=6, freq="2MS", calendar="noleap") |
| 2468 | + orig = Dataset(coords={"time": time}) |
| 2469 | + |
| 2470 | + renamed = orig.rename(time="time_new") |
| 2471 | + assert "time_new" in renamed.indexes |
| 2472 | + assert isinstance(renamed.indexes["time_new"], CFTimeIndex) |
| 2473 | + assert renamed.indexes["time_new"].name == "time_new" |
| 2474 | + |
| 2475 | + # check original has not changed |
| 2476 | + assert "time" in orig.indexes |
| 2477 | + assert isinstance(orig.indexes["time"], CFTimeIndex) |
| 2478 | + assert orig.indexes["time"].name == "time" |
| 2479 | + |
| 2480 | + # note: rename_dims(time="time_new") drops "ds.indexes" |
| 2481 | + renamed = orig.rename_dims() |
| 2482 | + assert isinstance(renamed.indexes["time"], CFTimeIndex) |
| 2483 | + |
| 2484 | + renamed = orig.rename_vars() |
| 2485 | + assert isinstance(renamed.indexes["time"], CFTimeIndex) |
| 2486 | + |
| 2487 | + def test_rename_does_not_change_DatetimeIndex_type(self): |
| 2488 | + # make sure DatetimeIndex is conderved on rename |
| 2489 | + |
| 2490 | + time = pd.date_range(start="2000", periods=6, freq="2MS") |
| 2491 | + orig = Dataset(coords={"time": time}) |
| 2492 | + |
| 2493 | + renamed = orig.rename(time="time_new") |
| 2494 | + assert "time_new" in renamed.indexes |
| 2495 | + assert isinstance(renamed.indexes["time_new"], DatetimeIndex) |
| 2496 | + assert renamed.indexes["time_new"].name == "time_new" |
| 2497 | + |
| 2498 | + # check original has not changed |
| 2499 | + assert "time" in orig.indexes |
| 2500 | + assert isinstance(orig.indexes["time"], DatetimeIndex) |
| 2501 | + assert orig.indexes["time"].name == "time" |
| 2502 | + |
| 2503 | + # note: rename_dims(time="time_new") drops "ds.indexes" |
| 2504 | + renamed = orig.rename_dims() |
| 2505 | + assert isinstance(renamed.indexes["time"], DatetimeIndex) |
| 2506 | + |
| 2507 | + renamed = orig.rename_vars() |
| 2508 | + assert isinstance(renamed.indexes["time"], DatetimeIndex) |
| 2509 | + |
2461 | 2510 | def test_swap_dims(self):
|
2462 | 2511 | original = Dataset({"x": [1, 2, 3], "y": ("x", list("abc")), "z": 42})
|
2463 | 2512 | expected = Dataset({"z": 42}, {"x": ("y", [1, 2, 3]), "y": list("abc")})
|
|
0 commit comments