Skip to content

Commit 2f9d4fb

Browse files
jbrockmendeljreback
authored andcommitted
parametrize the first few arithmetic tests (#18133)
1 parent 17e0b13 commit 2f9d4fb

File tree

3 files changed

+179
-101
lines changed

3 files changed

+179
-101
lines changed

pandas/tests/indexes/datetimes/test_arithmetic.py

+104-67
Original file line numberDiff line numberDiff line change
@@ -14,77 +14,118 @@
1414
date_range)
1515

1616

17+
@pytest.fixture(params=[None, 'UTC', 'Asia/Tokyo',
18+
'US/Eastern', 'dateutil/Asia/Singapore',
19+
'dateutil/US/Pacific'])
20+
def tz(request):
21+
return request.param
22+
23+
24+
@pytest.fixture(params=[pd.offsets.Hour(2), timedelta(hours=2),
25+
np.timedelta64(2, 'h'), Timedelta(hours=2)],
26+
ids=str)
27+
def delta(request):
28+
# Several ways of representing two hours
29+
return request.param
30+
31+
32+
@pytest.fixture(
33+
params=[
34+
datetime(2011, 1, 1),
35+
DatetimeIndex(['2011-01-01', '2011-01-02']),
36+
DatetimeIndex(['2011-01-01', '2011-01-02']).tz_localize('US/Eastern'),
37+
np.datetime64('2011-01-01'),
38+
Timestamp('2011-01-01')],
39+
ids=lambda x: type(x).__name__)
40+
def addend(request):
41+
return request.param
42+
43+
1744
class TestDatetimeIndexArithmetic(object):
18-
tz = [None, 'UTC', 'Asia/Tokyo', 'US/Eastern', 'dateutil/Asia/Singapore',
19-
'dateutil/US/Pacific']
20-
21-
def test_add_iadd(self):
22-
for tz in self.tz:
23-
24-
# offset
25-
offsets = [pd.offsets.Hour(2), timedelta(hours=2),
26-
np.timedelta64(2, 'h'), Timedelta(hours=2)]
27-
28-
for delta in offsets:
29-
rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz)
30-
result = rng + delta
31-
expected = pd.date_range('2000-01-01 02:00',
32-
'2000-02-01 02:00', tz=tz)
33-
tm.assert_index_equal(result, expected)
34-
rng += delta
35-
tm.assert_index_equal(rng, expected)
36-
37-
# int
38-
rng = pd.date_range('2000-01-01 09:00', freq='H', periods=10,
39-
tz=tz)
40-
result = rng + 1
41-
expected = pd.date_range('2000-01-01 10:00', freq='H', periods=10,
42-
tz=tz)
43-
tm.assert_index_equal(result, expected)
44-
rng += 1
45-
tm.assert_index_equal(rng, expected)
4645

46+
def test_dti_add_timestamp_raises(self):
4747
idx = DatetimeIndex(['2011-01-01', '2011-01-02'])
4848
msg = "cannot add DatetimeIndex and Timestamp"
4949
with tm.assert_raises_regex(TypeError, msg):
5050
idx + Timestamp('2011-01-01')
5151

52+
def test_dti_radd_timestamp_raises(self):
53+
idx = DatetimeIndex(['2011-01-01', '2011-01-02'])
54+
msg = "cannot add DatetimeIndex and Timestamp"
5255
with tm.assert_raises_regex(TypeError, msg):
5356
Timestamp('2011-01-01') + idx
5457

55-
def test_sub_isub(self):
56-
for tz in self.tz:
57-
58-
# offset
59-
offsets = [pd.offsets.Hour(2), timedelta(hours=2),
60-
np.timedelta64(2, 'h'), Timedelta(hours=2)]
61-
62-
for delta in offsets:
63-
rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz)
64-
expected = pd.date_range('1999-12-31 22:00',
65-
'2000-01-31 22:00', tz=tz)
66-
67-
result = rng - delta
68-
tm.assert_index_equal(result, expected)
69-
rng -= delta
70-
tm.assert_index_equal(rng, expected)
71-
72-
# int
73-
rng = pd.date_range('2000-01-01 09:00', freq='H', periods=10,
74-
tz=tz)
75-
result = rng - 1
76-
expected = pd.date_range('2000-01-01 08:00', freq='H', periods=10,
77-
tz=tz)
78-
tm.assert_index_equal(result, expected)
79-
rng -= 1
80-
tm.assert_index_equal(rng, expected)
81-
82-
@pytest.mark.parametrize('addend', [
83-
datetime(2011, 1, 1),
84-
DatetimeIndex(['2011-01-01', '2011-01-02']),
85-
DatetimeIndex(['2011-01-01', '2011-01-02']).tz_localize('US/Eastern'),
86-
np.datetime64('2011-01-01'),
87-
Timestamp('2011-01-01')])
58+
# -------------------------------------------------------------
59+
# Binary operations DatetimeIndex and int
60+
61+
def test_dti_add_int(self, tz):
62+
rng = pd.date_range('2000-01-01 09:00', freq='H',
63+
periods=10, tz=tz)
64+
result = rng + 1
65+
expected = pd.date_range('2000-01-01 10:00', freq='H',
66+
periods=10, tz=tz)
67+
tm.assert_index_equal(result, expected)
68+
69+
def test_dti_iadd_int(self, tz):
70+
rng = pd.date_range('2000-01-01 09:00', freq='H',
71+
periods=10, tz=tz)
72+
expected = pd.date_range('2000-01-01 10:00', freq='H',
73+
periods=10, tz=tz)
74+
rng += 1
75+
tm.assert_index_equal(rng, expected)
76+
77+
def test_dti_sub_int(self, tz):
78+
rng = pd.date_range('2000-01-01 09:00', freq='H',
79+
periods=10, tz=tz)
80+
result = rng - 1
81+
expected = pd.date_range('2000-01-01 08:00', freq='H',
82+
periods=10, tz=tz)
83+
tm.assert_index_equal(result, expected)
84+
85+
def test_dti_isub_int(self, tz):
86+
rng = pd.date_range('2000-01-01 09:00', freq='H',
87+
periods=10, tz=tz)
88+
expected = pd.date_range('2000-01-01 08:00', freq='H',
89+
periods=10, tz=tz)
90+
rng -= 1
91+
tm.assert_index_equal(rng, expected)
92+
93+
# -------------------------------------------------------------
94+
# Binary operations DatetimeIndex and timedelta-like
95+
96+
def test_dti_add_timedeltalike(self, tz, delta):
97+
rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz)
98+
result = rng + delta
99+
expected = pd.date_range('2000-01-01 02:00',
100+
'2000-02-01 02:00', tz=tz)
101+
tm.assert_index_equal(result, expected)
102+
103+
def test_dti_iadd_timedeltalike(self, tz, delta):
104+
rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz)
105+
expected = pd.date_range('2000-01-01 02:00',
106+
'2000-02-01 02:00', tz=tz)
107+
rng += delta
108+
tm.assert_index_equal(rng, expected)
109+
110+
def test_dti_sub_timedeltalike(self, tz, delta):
111+
rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz)
112+
expected = pd.date_range('1999-12-31 22:00',
113+
'2000-01-31 22:00', tz=tz)
114+
result = rng - delta
115+
tm.assert_index_equal(result, expected)
116+
117+
def test_dti_isub_timedeltalike(self, tz, delta):
118+
rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz)
119+
expected = pd.date_range('1999-12-31 22:00',
120+
'2000-01-31 22:00', tz=tz)
121+
rng -= delta
122+
tm.assert_index_equal(rng, expected)
123+
124+
# -------------------------------------------------------------
125+
# Binary Operations DatetimeIndex and datetime-like
126+
# TODO: A couple other tests belong in this section. Move them in
127+
# A PR where there isn't already a giant diff.
128+
88129
def test_add_datetimelike_and_dti(self, addend):
89130
# GH#9631
90131
dti = DatetimeIndex(['2011-01-01', '2011-01-02'])
@@ -95,12 +136,6 @@ def test_add_datetimelike_and_dti(self, addend):
95136
with tm.assert_raises_regex(TypeError, msg):
96137
addend + dti
97138

98-
@pytest.mark.parametrize('addend', [
99-
datetime(2011, 1, 1),
100-
DatetimeIndex(['2011-01-01', '2011-01-02']),
101-
DatetimeIndex(['2011-01-01', '2011-01-02']).tz_localize('US/Eastern'),
102-
np.datetime64('2011-01-01'),
103-
Timestamp('2011-01-01')])
104139
def test_add_datetimelike_and_dti_tz(self, addend):
105140
# GH#9631
106141
dti_tz = DatetimeIndex(['2011-01-01',
@@ -112,6 +147,8 @@ def test_add_datetimelike_and_dti_tz(self, addend):
112147
with tm.assert_raises_regex(TypeError, msg):
113148
addend + dti_tz
114149

150+
# -------------------------------------------------------------
151+
115152
def test_sub_dti_dti(self):
116153
# previously performed setop (deprecated in 0.16.0), now changed to
117154
# return subtraction -> TimeDeltaIndex (GH ...)

pandas/tests/indexes/timedeltas/test_arithmetic.py

+74-34
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,21 @@
1212
Timestamp, Timedelta)
1313

1414

15+
@pytest.fixture(params=[pd.offsets.Hour(2), timedelta(hours=2),
16+
np.timedelta64(2, 'h'), Timedelta(hours=2)],
17+
ids=str)
18+
def delta(request):
19+
# Several ways of representing two hours
20+
return request.param
21+
22+
23+
@pytest.fixture(params=['B', 'D'])
24+
def freq(request):
25+
return request.param
26+
27+
1528
class TestTimedeltaIndexArithmetic(object):
1629
_holder = TimedeltaIndex
17-
_multiprocess_can_split_ = True
1830

1931
# TODO: Split by ops, better name
2032
def test_numeric_compat(self):
@@ -88,62 +100,91 @@ def test_ufunc_coercions(self):
88100
tm.assert_index_equal(result, exp)
89101
assert result.freq is None
90102

91-
def test_add_iadd(self):
92-
# only test adding/sub offsets as + is now numeric
93-
94-
# offset
95-
offsets = [pd.offsets.Hour(2), timedelta(hours=2),
96-
np.timedelta64(2, 'h'), Timedelta(hours=2)]
97-
98-
for delta in offsets:
99-
rng = timedelta_range('1 days', '10 days')
100-
result = rng + delta
101-
expected = timedelta_range('1 days 02:00:00', '10 days 02:00:00',
102-
freq='D')
103-
tm.assert_index_equal(result, expected)
104-
rng += delta
105-
tm.assert_index_equal(rng, expected)
103+
# -------------------------------------------------------------
104+
# Binary operations TimedeltaIndex and integer
106105

107-
# int
106+
def test_tdi_add_int(self):
108107
rng = timedelta_range('1 days 09:00:00', freq='H', periods=10)
109108
result = rng + 1
110109
expected = timedelta_range('1 days 10:00:00', freq='H', periods=10)
111110
tm.assert_index_equal(result, expected)
111+
112+
def test_tdi_iadd_int(self):
113+
rng = timedelta_range('1 days 09:00:00', freq='H', periods=10)
114+
expected = timedelta_range('1 days 10:00:00', freq='H', periods=10)
112115
rng += 1
113116
tm.assert_index_equal(rng, expected)
114117

115-
def test_sub_isub(self):
116-
# only test adding/sub offsets as - is now numeric
117-
118-
# offset
119-
offsets = [pd.offsets.Hour(2), timedelta(hours=2),
120-
np.timedelta64(2, 'h'), Timedelta(hours=2)]
121-
122-
for delta in offsets:
123-
rng = timedelta_range('1 days', '10 days')
124-
result = rng - delta
125-
expected = timedelta_range('0 days 22:00:00', '9 days 22:00:00')
126-
tm.assert_index_equal(result, expected)
127-
rng -= delta
128-
tm.assert_index_equal(rng, expected)
129-
130-
# int
118+
def test_tdi_sub_int(self):
131119
rng = timedelta_range('1 days 09:00:00', freq='H', periods=10)
132120
result = rng - 1
133121
expected = timedelta_range('1 days 08:00:00', freq='H', periods=10)
134122
tm.assert_index_equal(result, expected)
123+
124+
def test_tdi_isub_int(self):
125+
rng = timedelta_range('1 days 09:00:00', freq='H', periods=10)
126+
expected = timedelta_range('1 days 08:00:00', freq='H', periods=10)
135127
rng -= 1
136128
tm.assert_index_equal(rng, expected)
137129

130+
# -------------------------------------------------------------
131+
# Binary operations TimedeltaIndex and timedelta-like
132+
133+
def test_tdi_add_timedeltalike(self, delta):
134+
# only test adding/sub offsets as + is now numeric
135+
rng = timedelta_range('1 days', '10 days')
136+
result = rng + delta
137+
expected = timedelta_range('1 days 02:00:00', '10 days 02:00:00',
138+
freq='D')
139+
tm.assert_index_equal(result, expected)
140+
141+
def test_tdi_iadd_timedeltalike(self, delta):
142+
# only test adding/sub offsets as + is now numeric
143+
rng = timedelta_range('1 days', '10 days')
144+
expected = timedelta_range('1 days 02:00:00', '10 days 02:00:00',
145+
freq='D')
146+
rng += delta
147+
tm.assert_index_equal(rng, expected)
148+
149+
def test_tdi_sub_timedeltalike(self, delta):
150+
# only test adding/sub offsets as - is now numeric
151+
rng = timedelta_range('1 days', '10 days')
152+
result = rng - delta
153+
expected = timedelta_range('0 days 22:00:00', '9 days 22:00:00')
154+
tm.assert_index_equal(result, expected)
155+
156+
def test_tdi_isub_timedeltalike(self, delta):
157+
# only test adding/sub offsets as - is now numeric
158+
rng = timedelta_range('1 days', '10 days')
159+
expected = timedelta_range('0 days 22:00:00', '9 days 22:00:00')
160+
rng -= delta
161+
tm.assert_index_equal(rng, expected)
162+
163+
# -------------------------------------------------------------
164+
# Binary operations TimedeltaIndex and datetime-like
165+
166+
def test_tdi_sub_timestamp_raises(self):
138167
idx = TimedeltaIndex(['1 day', '2 day'])
139168
msg = "cannot subtract a datelike from a TimedeltaIndex"
140169
with tm.assert_raises_regex(TypeError, msg):
141170
idx - Timestamp('2011-01-01')
142171

172+
def test_tdi_add_timestamp(self):
173+
idx = TimedeltaIndex(['1 day', '2 day'])
174+
175+
result = idx + Timestamp('2011-01-01')
176+
expected = DatetimeIndex(['2011-01-02', '2011-01-03'])
177+
tm.assert_index_equal(result, expected)
178+
179+
def test_tdi_radd_timestamp(self):
180+
idx = TimedeltaIndex(['1 day', '2 day'])
181+
143182
result = Timestamp('2011-01-01') + idx
144183
expected = DatetimeIndex(['2011-01-02', '2011-01-03'])
145184
tm.assert_index_equal(result, expected)
146185

186+
# -------------------------------------------------------------
187+
147188
# TODO: Split by operation, better name
148189
def test_ops_compat(self):
149190

@@ -634,7 +675,6 @@ def test_tdi_ops_attributes(self):
634675

635676
# TODO: Needs more informative name, probably split up into
636677
# more targeted tests
637-
@pytest.mark.parametrize('freq', ['B', 'D'])
638678
def test_timedelta(self, freq):
639679
index = date_range('1/1/2000', periods=50, freq=freq)
640680

pandas/tests/test_downstream.py

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# -*- coding: utf-8 -*-
12
"""
23
Testing that we work in the downstream packages
34
"""

0 commit comments

Comments
 (0)