Skip to content

Commit a987bb1

Browse files
Address pandas-related upstream errors in #10973 (#10988)
* Address errors due to pandas-dev/pandas#63146 * Address errors due to pandas-dev/pandas#63018 * Address errors due to pandas-dev/pandas#63231 * Address errors due to pandas-dev/pandas#63196 * Fix mypy errors
1 parent 58594f8 commit a987bb1

File tree

6 files changed

+50
-23
lines changed

6 files changed

+50
-23
lines changed

xarray/tests/test_cftimeindex.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
assert_array_equal,
2828
assert_identical,
2929
has_cftime,
30+
has_pandas_3,
3031
requires_cftime,
3132
)
3233

@@ -960,8 +961,17 @@ def test_cftime_datetime_sub_cftimeindex(calendar):
960961
@pytest.mark.parametrize("calendar", _CFTIME_CALENDARS)
961962
def test_distant_cftime_datetime_sub_cftimeindex(calendar):
962963
a = xr.date_range("2000", periods=5, calendar=calendar, use_cftime=True)
963-
with pytest.raises(ValueError, match="difference exceeds"):
964-
a.date_type(1, 1, 1) - a
964+
if not has_pandas_3:
965+
with pytest.raises(ValueError, match="difference exceeds"):
966+
a.date_type(1, 1, 1) - a
967+
else:
968+
result = a.date_type(1, 1, 1) - a
969+
assert isinstance(result, pd.TimedeltaIndex)
970+
assert result.unit == "us"
971+
972+
# Check that we can recover original index from subtracting timedeltas
973+
roundtrip = CFTimeIndex(a.date_type(1, 1, 1) - result.to_pytimedelta())
974+
assert roundtrip.equals(a)
965975

966976

967977
@requires_cftime

xarray/tests/test_coding_times.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -599,7 +599,7 @@ def test_cf_timedelta(timedeltas, units, numbers) -> None:
599599
if timedeltas == "NaT":
600600
timedeltas = np.timedelta64("NaT", "ns")
601601
else:
602-
timedeltas = pd.to_timedelta(timedeltas).to_numpy()
602+
timedeltas = pd.to_timedelta(timedeltas).as_unit("ns").to_numpy()
603603
numbers = np.array(numbers)
604604

605605
expected = numbers
@@ -623,8 +623,9 @@ def test_cf_timedelta_2d() -> None:
623623
units = "days"
624624
numbers = np.atleast_2d([1, 2, 3])
625625

626-
timedeltas = np.atleast_2d(pd.to_timedelta(["1D", "2D", "3D"]).to_numpy())
627-
expected = timedeltas
626+
timedeltas = pd.to_timedelta(["1D", "2D", "3D"]).as_unit("ns")
627+
timedeltas_2d = np.atleast_2d(timedeltas.to_numpy())
628+
expected = timedeltas_2d
628629

629630
actual = decode_cf_timedelta(numbers, units)
630631
assert_array_equal(expected, actual)

xarray/tests/test_groupby.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3815,7 +3815,7 @@ def test_mean_with_cftime_objects_dask():
38153815

38163816
def test_groupby_bins_datetime_mean():
38173817
"""Test groupby_bins with datetime mean (issue #6995)"""
3818-
times = pd.date_range("2020-01-01", "2020-02-01", freq="1h")
3818+
times = pd.date_range("2020-01-01", "2020-02-01", freq="1h", unit="ns")
38193819
index = np.arange(len(times))
38203820
bins = np.arange(0, len(index), 5)
38213821

@@ -3836,7 +3836,10 @@ def test_groupby_bins_mean_time_series():
38363836
ds = xr.Dataset(
38373837
{
38383838
"measurement": ("trial", np.arange(0, 100, 10)),
3839-
"time": ("trial", pd.date_range("20240101T1500", "20240101T1501", 10)),
3839+
"time": (
3840+
"trial",
3841+
pd.date_range("20240101T1500", "20240101T1501", 10, unit="ns"),
3842+
),
38403843
}
38413844
)
38423845

xarray/tests/test_interp.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -721,7 +721,7 @@ def test_datetime(x_new, expected) -> None:
721721
da = xr.DataArray(
722722
np.arange(24),
723723
dims="time",
724-
coords={"time": pd.date_range("2000-01-01", periods=24)},
724+
coords={"time": pd.date_range("2000-01-01", periods=24, unit="ns")},
725725
)
726726

727727
actual = da.interp(time=x_new)
@@ -739,7 +739,7 @@ def test_datetime_single_string() -> None:
739739
da = xr.DataArray(
740740
np.arange(24),
741741
dims="time",
742-
coords={"time": pd.date_range("2000-01-01", periods=24)},
742+
coords={"time": pd.date_range("2000-01-01", periods=24, unit="ns")},
743743
)
744744
actual = da.interp(time="2000-01-01T12:00")
745745
expected = xr.DataArray(0.5)

xarray/tests/test_plot.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2897,7 +2897,7 @@ def test_datetime_hue(self) -> None:
28972897
ds2["hue"] = pd.date_range("2000-1-1", periods=4)
28982898
ds2.plot.scatter(x="A", y="B", hue="hue")
28992899

2900-
ds2["hue"] = pd.timedelta_range("-1D", periods=4, freq="D")
2900+
ds2["hue"] = pd.timedelta_range("-1D", periods=4, freq="D", unit="ns") # type: ignore[call-arg,unused-ignore]
29012901
ds2.plot.scatter(x="A", y="B", hue="hue")
29022902

29032903
def test_facetgrid_hue_style(self) -> None:

xarray/tests/test_variable.py

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,16 @@ def var():
7474
],
7575
)
7676
def test_as_compatible_data_writeable(data):
77-
pd.set_option("mode.copy_on_write", True)
77+
# In pandas 3 the mode.copy_on_write option defaults to True, so the option
78+
# setting logic can be removed once our minimum version of pandas is
79+
# greater than or equal to 3.
80+
if not has_pandas_3:
81+
pd.set_option("mode.copy_on_write", True)
7882
# GH8843, ensure writeable arrays for data_vars even with
7983
# pandas copy-on-write mode
8084
assert as_compatible_data(data).flags.writeable
81-
pd.reset_option("mode.copy_on_write")
85+
if not has_pandas_3:
86+
pd.reset_option("mode.copy_on_write")
8287

8388

8489
class VariableSubclassobjects(NamedArraySubclassobjects, ABC):
@@ -225,7 +230,7 @@ def test_index_0d_timedelta64(self):
225230
x, np.timedelta64(td), np.dtype("timedelta64[us]")
226231
)
227232

228-
x = self.cls(["x"], pd.to_timedelta([td]))
233+
x = self.cls(["x"], pd.to_timedelta([td]).as_unit("ns"))
229234
self._assertIndexedLikeNDArray(x, np.timedelta64(td), "timedelta64[ns]")
230235

231236
def test_index_0d_not_a_time(self):
@@ -279,7 +284,7 @@ def test_0d_time_data(self):
279284
expected = np.datetime64("2000-01-01", "ns")
280285
assert x[0].values == expected
281286

282-
dt64_data = pd.date_range("1970-01-01", periods=3)
287+
dt64_data = pd.date_range("1970-01-01", periods=3, unit="ns")
283288

284289
@pytest.mark.parametrize(
285290
"values, unit",
@@ -311,7 +316,7 @@ def test_datetime64_conversion(self, values, unit):
311316
(td64_data.values.astype("timedelta64[m]"), "s"),
312317
(td64_data.values.astype("timedelta64[s]"), "s"),
313318
(td64_data.values.astype("timedelta64[ps]"), "ns"),
314-
(td64_data.to_pytimedelta(), "ns"),
319+
(td64_data.to_pytimedelta(), "us" if has_pandas_3 else "ns"),
315320
],
316321
)
317322
def test_timedelta64_conversion(self, values, unit):
@@ -1109,8 +1114,8 @@ def test_datetime64_conversion_scalar(self, values, unit):
11091114
(np.timedelta64(1, "m"), "s"),
11101115
(np.timedelta64(1, "D"), "s"),
11111116
(np.timedelta64(1001, "ps"), "ns"),
1112-
(pd.Timedelta("1 day"), "ns"),
1113-
(timedelta(days=1), "ns"),
1117+
(pd.Timedelta("1 day").as_unit("ns"), "ns"),
1118+
(timedelta(days=1), "us" if has_pandas_3 else "ns"),
11141119
],
11151120
)
11161121
def test_timedelta64_conversion_scalar(self, values, unit):
@@ -1135,7 +1140,8 @@ def test_0d_datetime(self):
11351140
assert v.values == np.datetime64("2000-01-01", expected_unit) # type: ignore[call-overload]
11361141

11371142
@pytest.mark.parametrize(
1138-
"values, unit", [(pd.to_timedelta("1s"), "ns"), (np.timedelta64(1, "s"), "s")]
1143+
"values, unit",
1144+
[(pd.to_timedelta("1s").as_unit("ns"), "ns"), (np.timedelta64(1, "s"), "s")],
11391145
)
11401146
def test_0d_timedelta(self, values, unit):
11411147
# todo: check, if this test is OK
@@ -3158,7 +3164,7 @@ def test_from_pint_wrapping_dask(self, Var):
31583164
(np.datetime64("2000-01-01", "s"), "s"),
31593165
(np.array([np.datetime64("2000-01-01", "ns")]), "ns"),
31603166
(np.array([np.datetime64("2000-01-01", "s")]), "s"),
3161-
(pd.date_range("2000", periods=1), "ns"),
3167+
(pd.date_range("2000", periods=1, unit="ns"), "ns"),
31623168
(
31633169
datetime(2000, 1, 1),
31643170
"us" if has_pandas_3 else "ns",
@@ -3167,10 +3173,17 @@ def test_from_pint_wrapping_dask(self, Var):
31673173
np.array([datetime(2000, 1, 1)]),
31683174
"us" if has_pandas_3 else "ns",
31693175
),
3170-
(pd.date_range("2000", periods=1, tz=pytz.timezone("America/New_York")), "ns"),
3176+
(
3177+
pd.date_range(
3178+
"2000", periods=1, tz=pytz.timezone("America/New_York"), unit="ns"
3179+
),
3180+
"ns",
3181+
),
31713182
(
31723183
pd.Series(
3173-
pd.date_range("2000", periods=1, tz=pytz.timezone("America/New_York"))
3184+
pd.date_range(
3185+
"2000", periods=1, tz=pytz.timezone("America/New_York"), unit="ns"
3186+
)
31743187
),
31753188
"ns",
31763189
),
@@ -3245,8 +3258,8 @@ def test_pandas_two_only_datetime_conversion_warnings(
32453258
(np.array([np.timedelta64(10, "ns")]), "ns"),
32463259
(np.array([np.timedelta64(10, "s")]), "s"),
32473260
(pd.timedelta_range("1", periods=1), "ns"),
3248-
(timedelta(days=1), "ns"),
3249-
(np.array([timedelta(days=1)]), "ns"),
3261+
(timedelta(days=1), "us" if has_pandas_3 else "ns"),
3262+
(np.array([timedelta(days=1)]), "us" if has_pandas_3 else "ns"),
32503263
(pd.timedelta_range("1", periods=1).astype("timedelta64[s]"), "s"),
32513264
],
32523265
ids=lambda x: f"{x}",

0 commit comments

Comments
 (0)