Skip to content

Commit 407ec33

Browse files
authored
TST: parametrize over dt64 unit (#55818)
1 parent c2cdeaf commit 407ec33

18 files changed

+179
-120
lines changed

pandas/_testing/__init__.py

+12
Original file line numberDiff line numberDiff line change
@@ -1019,6 +1019,17 @@ def iat(x):
10191019

10201020
# -----------------------------------------------------------------------------
10211021

1022+
_UNITS = ["s", "ms", "us", "ns"]
1023+
1024+
1025+
def get_finest_unit(left: str, right: str):
1026+
"""
1027+
Find the higher of two datetime64 units.
1028+
"""
1029+
if _UNITS.index(left) >= _UNITS.index(right):
1030+
return left
1031+
return right
1032+
10221033

10231034
def shares_memory(left, right) -> bool:
10241035
"""
@@ -1121,6 +1132,7 @@ def shares_memory(left, right) -> bool:
11211132
"getitem",
11221133
"get_locales",
11231134
"getMixedTypeDict",
1135+
"get_finest_unit",
11241136
"get_obj",
11251137
"get_op_from_name",
11261138
"getPeriodData",

pandas/conftest.py

+3
Original file line numberDiff line numberDiff line change
@@ -1303,6 +1303,9 @@ def unit(request):
13031303
return request.param
13041304

13051305

1306+
unit2 = unit
1307+
1308+
13061309
# ----------------------------------------------------------------
13071310
# Dtypes
13081311
# ----------------------------------------------------------------

pandas/tests/arithmetic/test_datetime64.py

+16-14
Original file line numberDiff line numberDiff line change
@@ -1696,8 +1696,8 @@ def test_dt64_series_arith_overflow(self):
16961696
tm.assert_series_equal(res, -expected)
16971697

16981698
def test_datetimeindex_sub_timestamp_overflow(self):
1699-
dtimax = pd.to_datetime(["2021-12-28 17:19", Timestamp.max])
1700-
dtimin = pd.to_datetime(["2021-12-28 17:19", Timestamp.min])
1699+
dtimax = pd.to_datetime(["2021-12-28 17:19", Timestamp.max]).as_unit("ns")
1700+
dtimin = pd.to_datetime(["2021-12-28 17:19", Timestamp.min]).as_unit("ns")
17011701

17021702
tsneg = Timestamp("1950-01-01").as_unit("ns")
17031703
ts_neg_variants = [
@@ -1735,11 +1735,11 @@ def test_datetimeindex_sub_timestamp_overflow(self):
17351735

17361736
def test_datetimeindex_sub_datetimeindex_overflow(self):
17371737
# GH#22492, GH#22508
1738-
dtimax = pd.to_datetime(["2021-12-28 17:19", Timestamp.max])
1739-
dtimin = pd.to_datetime(["2021-12-28 17:19", Timestamp.min])
1738+
dtimax = pd.to_datetime(["2021-12-28 17:19", Timestamp.max]).as_unit("ns")
1739+
dtimin = pd.to_datetime(["2021-12-28 17:19", Timestamp.min]).as_unit("ns")
17401740

1741-
ts_neg = pd.to_datetime(["1950-01-01", "1950-01-01"])
1742-
ts_pos = pd.to_datetime(["1980-01-01", "1980-01-01"])
1741+
ts_neg = pd.to_datetime(["1950-01-01", "1950-01-01"]).as_unit("ns")
1742+
ts_pos = pd.to_datetime(["1980-01-01", "1980-01-01"]).as_unit("ns")
17431743

17441744
# General tests
17451745
expected = Timestamp.max._value - ts_pos[1]._value
@@ -1815,12 +1815,16 @@ def test_operators_datetimelike(self):
18151815
td1 + dt1
18161816
dt1 + td1
18171817

1818-
def test_dt64ser_sub_datetime_dtype(self):
1818+
def test_dt64ser_sub_datetime_dtype(self, unit):
18191819
ts = Timestamp(datetime(1993, 1, 7, 13, 30, 00))
18201820
dt = datetime(1993, 6, 22, 13, 30)
1821-
ser = Series([ts])
1822-
result = pd.to_timedelta(np.abs(ser - dt))
1823-
assert result.dtype == "timedelta64[ns]"
1821+
ser = Series([ts], dtype=f"M8[{unit}]")
1822+
result = ser - dt
1823+
1824+
# the expected unit is the max of `unit` and the unit imputed to `dt`,
1825+
# which is "us"
1826+
exp_unit = tm.get_finest_unit(unit, "us")
1827+
assert result.dtype == f"timedelta64[{exp_unit}]"
18241828

18251829
# -------------------------------------------------------------
18261830
# TODO: This next block of tests came from tests.series.test_operators,
@@ -1899,10 +1903,8 @@ def test_sub_datetime_compat(self, unit):
18991903
# see GH#14088
19001904
ser = Series([datetime(2016, 8, 23, 12, tzinfo=pytz.utc), NaT]).dt.as_unit(unit)
19011905
dt = datetime(2016, 8, 22, 12, tzinfo=pytz.utc)
1902-
exp_unit = unit
1903-
if unit in ["s", "ms"]:
1904-
# The datetime object has "us" so we upcast
1905-
exp_unit = "us"
1906+
# The datetime object has "us" so we upcast lower units
1907+
exp_unit = tm.get_finest_unit(unit, "us")
19061908
exp = Series([Timedelta("1 days"), NaT]).dt.as_unit(exp_unit)
19071909
result = ser - dt
19081910
tm.assert_series_equal(result, exp)

pandas/tests/arrays/test_datetimes.py

+2-6
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,7 @@
1515
import numpy as np
1616
import pytest
1717

18-
from pandas._libs.tslibs import (
19-
npy_unit_to_abbrev,
20-
tz_compare,
21-
)
18+
from pandas._libs.tslibs import tz_compare
2219

2320
from pandas.core.dtypes.dtypes import DatetimeTZDtype
2421

@@ -235,8 +232,7 @@ def test_add_timedeltalike_scalar_mismatched_reso(self, dta_dti, scalar):
235232
dta, dti = dta_dti
236233

237234
td = pd.Timedelta(scalar)
238-
exp_reso = max(dta._creso, td._creso)
239-
exp_unit = npy_unit_to_abbrev(exp_reso)
235+
exp_unit = tm.get_finest_unit(dta.unit, td.unit)
240236

241237
expected = (dti + td)._data.as_unit(exp_unit)
242238
result = dta + scalar

pandas/tests/frame/methods/test_reset_index.py

+1-8
Original file line numberDiff line numberDiff line change
@@ -76,19 +76,12 @@ def test_reset_index_tz(self, tz_aware_fixture):
7676

7777
expected = DataFrame(
7878
{
79-
"idx": [
80-
datetime(2011, 1, 1),
81-
datetime(2011, 1, 2),
82-
datetime(2011, 1, 3),
83-
datetime(2011, 1, 4),
84-
datetime(2011, 1, 5),
85-
],
79+
"idx": idx,
8680
"a": range(5),
8781
"b": ["A", "B", "C", "D", "E"],
8882
},
8983
columns=["idx", "a", "b"],
9084
)
91-
expected["idx"] = expected["idx"].apply(lambda d: Timestamp(d, tz=tz))
9285
tm.assert_frame_equal(df.reset_index(), expected)
9386

9487
@pytest.mark.parametrize("tz", ["US/Eastern", "dateutil/US/Eastern"])

pandas/tests/indexes/datetimes/methods/test_delete.py

+22-10
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,25 @@
99

1010

1111
class TestDelete:
12-
def test_delete(self):
13-
idx = date_range(start="2000-01-01", periods=5, freq="ME", name="idx")
12+
def test_delete(self, unit):
13+
idx = date_range(
14+
start="2000-01-01", periods=5, freq="ME", name="idx", unit=unit
15+
)
1416

1517
# preserve freq
16-
expected_0 = date_range(start="2000-02-01", periods=4, freq="ME", name="idx")
17-
expected_4 = date_range(start="2000-01-01", periods=4, freq="ME", name="idx")
18+
expected_0 = date_range(
19+
start="2000-02-01", periods=4, freq="ME", name="idx", unit=unit
20+
)
21+
expected_4 = date_range(
22+
start="2000-01-01", periods=4, freq="ME", name="idx", unit=unit
23+
)
1824

1925
# reset freq to None
2026
expected_1 = DatetimeIndex(
2127
["2000-01-31", "2000-03-31", "2000-04-30", "2000-05-31"],
2228
freq=None,
2329
name="idx",
24-
)
30+
).as_unit(unit)
2531

2632
cases = {
2733
0: expected_0,
@@ -64,12 +70,18 @@ def test_delete2(self, tz):
6470
assert result.freqstr == "h"
6571
assert result.tz == expected.tz
6672

67-
def test_delete_slice(self):
68-
idx = date_range(start="2000-01-01", periods=10, freq="D", name="idx")
73+
def test_delete_slice(self, unit):
74+
idx = date_range(
75+
start="2000-01-01", periods=10, freq="D", name="idx", unit=unit
76+
)
6977

7078
# preserve freq
71-
expected_0_2 = date_range(start="2000-01-04", periods=7, freq="D", name="idx")
72-
expected_7_9 = date_range(start="2000-01-01", periods=7, freq="D", name="idx")
79+
expected_0_2 = date_range(
80+
start="2000-01-04", periods=7, freq="D", name="idx", unit=unit
81+
)
82+
expected_7_9 = date_range(
83+
start="2000-01-01", periods=7, freq="D", name="idx", unit=unit
84+
)
7385

7486
# reset freq to None
7587
expected_3_5 = DatetimeIndex(
@@ -84,7 +96,7 @@ def test_delete_slice(self):
8496
],
8597
freq=None,
8698
name="idx",
87-
)
99+
).as_unit(unit)
88100

89101
cases = {
90102
(0, 1, 2): expected_0_2,

pandas/tests/indexes/datetimes/methods/test_insert.py

+21-12
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,15 @@ def test_insert_empty_preserves_freq(self, tz_naive_fixture):
5252
result = dti.insert(0, item)
5353
assert result.freq is None
5454

55-
def test_insert(self):
56-
idx = DatetimeIndex(["2000-01-04", "2000-01-01", "2000-01-02"], name="idx")
55+
def test_insert(self, unit):
56+
idx = DatetimeIndex(
57+
["2000-01-04", "2000-01-01", "2000-01-02"], name="idx"
58+
).as_unit(unit)
5759

5860
result = idx.insert(2, datetime(2000, 1, 5))
5961
exp = DatetimeIndex(
6062
["2000-01-04", "2000-01-01", "2000-01-05", "2000-01-02"], name="idx"
61-
)
63+
).as_unit(unit)
6264
tm.assert_index_equal(result, exp)
6365

6466
# insertion of non-datetime should coerce to object index
@@ -76,31 +78,32 @@ def test_insert(self):
7678
tm.assert_index_equal(result, expected)
7779
assert result.name == expected.name
7880

79-
idx = date_range("1/1/2000", periods=3, freq="ME", name="idx")
81+
def test_insert2(self, unit):
82+
idx = date_range("1/1/2000", periods=3, freq="ME", name="idx", unit=unit)
8083

8184
# preserve freq
8285
expected_0 = DatetimeIndex(
8386
["1999-12-31", "2000-01-31", "2000-02-29", "2000-03-31"],
8487
name="idx",
8588
freq="ME",
86-
)
89+
).as_unit(unit)
8790
expected_3 = DatetimeIndex(
8891
["2000-01-31", "2000-02-29", "2000-03-31", "2000-04-30"],
8992
name="idx",
9093
freq="ME",
91-
)
94+
).as_unit(unit)
9295

9396
# reset freq to None
9497
expected_1_nofreq = DatetimeIndex(
9598
["2000-01-31", "2000-01-31", "2000-02-29", "2000-03-31"],
9699
name="idx",
97100
freq=None,
98-
)
101+
).as_unit(unit)
99102
expected_3_nofreq = DatetimeIndex(
100103
["2000-01-31", "2000-02-29", "2000-03-31", "2000-01-02"],
101104
name="idx",
102105
freq=None,
103-
)
106+
).as_unit(unit)
104107

105108
cases = [
106109
(0, datetime(1999, 12, 31), expected_0),
@@ -116,22 +119,28 @@ def test_insert(self):
116119
assert result.name == expected.name
117120
assert result.freq == expected.freq
118121

122+
def test_insert3(self, unit):
123+
idx = date_range("1/1/2000", periods=3, freq="ME", name="idx", unit=unit)
124+
119125
# reset freq to None
120126
result = idx.insert(3, datetime(2000, 1, 2))
121127
expected = DatetimeIndex(
122128
["2000-01-31", "2000-02-29", "2000-03-31", "2000-01-02"],
123129
name="idx",
124130
freq=None,
125-
)
131+
).as_unit(unit)
126132
tm.assert_index_equal(result, expected)
127133
assert result.name == expected.name
128134
assert result.freq is None
129135

136+
def test_insert4(self, unit):
130137
for tz in ["US/Pacific", "Asia/Singapore"]:
131-
idx = date_range("1/1/2000 09:00", periods=6, freq="h", tz=tz, name="idx")
138+
idx = date_range(
139+
"1/1/2000 09:00", periods=6, freq="h", tz=tz, name="idx", unit=unit
140+
)
132141
# preserve freq
133142
expected = date_range(
134-
"1/1/2000 09:00", periods=7, freq="h", tz=tz, name="idx"
143+
"1/1/2000 09:00", periods=7, freq="h", tz=tz, name="idx", unit=unit
135144
)
136145
for d in [
137146
Timestamp("2000-01-01 15:00", tz=tz),
@@ -156,7 +165,7 @@ def test_insert(self):
156165
name="idx",
157166
tz=tz,
158167
freq=None,
159-
)
168+
).as_unit(unit)
160169
# reset freq to None
161170
for d in [
162171
Timestamp("2000-01-01 10:00", tz=tz),

pandas/tests/indexes/datetimes/methods/test_repeat.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,14 @@
1111

1212
class TestRepeat:
1313
def test_repeat_range(self, tz_naive_fixture):
14-
tz = tz_naive_fixture
1514
rng = date_range("1/1/2000", "1/1/2001")
1615

1716
result = rng.repeat(5)
1817
assert result.freq is None
1918
assert len(result) == 5 * len(rng)
2019

20+
def test_repeat_range2(self, tz_naive_fixture):
21+
tz = tz_naive_fixture
2122
index = date_range("2001-01-01", periods=2, freq="D", tz=tz)
2223
exp = DatetimeIndex(
2324
["2001-01-01", "2001-01-01", "2001-01-02", "2001-01-02"], tz=tz
@@ -26,6 +27,8 @@ def test_repeat_range(self, tz_naive_fixture):
2627
tm.assert_index_equal(res, exp)
2728
assert res.freq is None
2829

30+
def test_repeat_range3(self, tz_naive_fixture):
31+
tz = tz_naive_fixture
2932
index = date_range("2001-01-01", periods=2, freq="2D", tz=tz)
3033
exp = DatetimeIndex(
3134
["2001-01-01", "2001-01-01", "2001-01-03", "2001-01-03"], tz=tz
@@ -34,6 +37,8 @@ def test_repeat_range(self, tz_naive_fixture):
3437
tm.assert_index_equal(res, exp)
3538
assert res.freq is None
3639

40+
def test_repeat_range4(self, tz_naive_fixture):
41+
tz = tz_naive_fixture
3742
index = DatetimeIndex(["2001-01-01", "NaT", "2003-01-01"], tz=tz)
3843
exp = DatetimeIndex(
3944
[

pandas/tests/indexes/datetimes/methods/test_round.py

+5
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ def test_round(self, tz_naive_fixture):
7171
with pytest.raises(ValueError, match=msg):
7272
elt.round(freq="ME")
7373

74+
def test_round2(self, tz_naive_fixture):
75+
tz = tz_naive_fixture
7476
# GH#14440 & GH#15578
7577
index = DatetimeIndex(["2016-10-17 12:00:00.0015"], tz=tz)
7678
result = index.round("ms")
@@ -80,11 +82,14 @@ def test_round(self, tz_naive_fixture):
8082
for freq in ["us", "ns"]:
8183
tm.assert_index_equal(index, index.round(freq))
8284

85+
def test_round3(self, tz_naive_fixture):
86+
tz = tz_naive_fixture
8387
index = DatetimeIndex(["2016-10-17 12:00:00.00149"], tz=tz)
8488
result = index.round("ms")
8589
expected = DatetimeIndex(["2016-10-17 12:00:00.001000"], tz=tz)
8690
tm.assert_index_equal(result, expected)
8791

92+
def test_round4(self, tz_naive_fixture):
8893
index = DatetimeIndex(["2016-10-17 12:00:00.001501031"])
8994
result = index.round("10ns")
9095
expected = DatetimeIndex(["2016-10-17 12:00:00.001501030"])

0 commit comments

Comments
 (0)