Skip to content

Commit e3e15ea

Browse files
jbrockmendeljreback
authored andcommitted
parametrize the first few arithmetic tests
1 parent 8113b87 commit e3e15ea

File tree

2 files changed

+161
-82
lines changed

2 files changed

+161
-82
lines changed

pandas/tests/indexes/datetimes/test_arithmetic.py

+92-51
Original file line numberDiff line numberDiff line change
@@ -14,70 +14,109 @@
1414
date_range)
1515

1616

17+
1718
class TestDatetimeIndexArithmetic(object):
1819
tz = [None, 'UTC', 'Asia/Tokyo', 'US/Eastern', 'dateutil/Asia/Singapore',
1920
'dateutil/US/Pacific']
2021

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)
22+
# Several ways of representing two hours
23+
two_hour_variants = [pd.offsets.Hour(2), timedelta(hours=2),
24+
np.timedelta64(2, 'h'), Timedelta(hours=2)]
4625

26+
def test_dti_add_timestamp_raises(self):
4727
idx = DatetimeIndex(['2011-01-01', '2011-01-02'])
4828
msg = "cannot add DatetimeIndex and Timestamp"
4929
with tm.assert_raises_regex(TypeError, msg):
5030
idx + Timestamp('2011-01-01')
5131

32+
def test_dti_radd_timestamp_raises(self):
33+
idx = DatetimeIndex(['2011-01-01', '2011-01-02'])
34+
msg = "cannot add DatetimeIndex and Timestamp"
5235
with tm.assert_raises_regex(TypeError, msg):
5336
Timestamp('2011-01-01') + idx
5437

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)
38+
# -------------------------------------------------------------
39+
# Binary operations DatetimeIndex and int
40+
41+
@pytest.mark.parametrize('tz', tz)
42+
def test_dti_add_int(self, tz):
43+
rng = pd.date_range('2000-01-01 09:00', freq='H',
44+
periods=10, tz=tz)
45+
result = rng + 1
46+
expected = pd.date_range('2000-01-01 10:00', freq='H',
47+
periods=10, tz=tz)
48+
tm.assert_index_equal(result, expected)
49+
50+
@pytest.mark.parametrize('tz', tz)
51+
def test_dti_iadd_int(self, tz):
52+
rng = pd.date_range('2000-01-01 09:00', freq='H',
53+
periods=10, tz=tz)
54+
expected = pd.date_range('2000-01-01 10:00', freq='H',
55+
periods=10, tz=tz)
56+
rng += 1
57+
tm.assert_index_equal(rng, expected)
58+
59+
@pytest.mark.parametrize('tz', tz)
60+
def test_dti_sub_int(self):
61+
rng = pd.date_range('2000-01-01 09:00', freq='H',
62+
periods=10, tz=tz)
63+
result = rng - 1
64+
expected = pd.date_range('2000-01-01 08:00', freq='H',
65+
periods=10, tz=tz)
66+
tm.assert_index_equal(result, expected)
67+
68+
@pytest.mark.parametrize('tz', tz)
69+
def test_dti_isub_int(self):
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 08:00', freq='H',
73+
periods=10, tz=tz)
74+
rng -= 1
75+
tm.assert_index_equal(rng, expected)
76+
77+
# -------------------------------------------------------------
78+
# Binary operations DatetimeIndex and timedelta-like
79+
80+
@pytest.mark.parametrize('delta', two_hour_variants)
81+
@pytest.mark.parametrize('tz', tz)
82+
def test_dti_add_timedeltalike(self, tz):
83+
rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz)
84+
result = rng + delta
85+
expected = pd.date_range('2000-01-01 02:00',
86+
'2000-02-01 02:00', tz=tz)
87+
tm.assert_index_equal(result, expected)
88+
89+
@pytest.mark.parametrize('delta', two_hour_variants)
90+
@pytest.mark.parametrize('tz', tz)
91+
def test_dti_iadd_timedeltalike(self, tz):
92+
rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz)
93+
expected = pd.date_range('2000-01-01 02:00',
94+
'2000-02-01 02:00', tz=tz)
95+
rng += delta
96+
tm.assert_index_equal(rng, expected)
97+
98+
@pytest.mark.parametrize('delta', two_hour_variants)
99+
@pytest.mark.parametrize('tz', tz)
100+
def test_dti_sub_timedeltalike(self, tz):
101+
rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz)
102+
expected = pd.date_range('1999-12-31 22:00',
103+
'2000-01-31 22:00', tz=tz)
104+
result = rng - delta
105+
tm.assert_index_equal(result, expected)
106+
107+
@pytest.mark.parametrize('delta', two_hour_variants)
108+
@pytest.mark.parametrize('tz', tz)
109+
def test_dti_isub_timedeltalike(self, tz):
110+
rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz)
111+
expected = pd.date_range('1999-12-31 22:00',
112+
'2000-01-31 22:00', tz=tz)
113+
rng -= delta
114+
tm.assert_index_equal(rng, expected)
115+
116+
# -------------------------------------------------------------
117+
# Binary Operations DatetimeIndex and datetime-like
118+
# TODO: A couple other tests belong in this section. Move them in
119+
# A PR where there isn't already a giant diff.
81120

82121
@pytest.mark.parametrize('addend', [
83122
datetime(2011, 1, 1),
@@ -112,6 +151,8 @@ def test_add_datetimelike_and_dti_tz(self, addend):
112151
with tm.assert_raises_regex(TypeError, msg):
113152
addend + dti_tz
114153

154+
# -------------------------------------------------------------
155+
115156
def test_sub_dti_dti(self):
116157
# previously performed setop (deprecated in 0.16.0), now changed to
117158
# return subtraction -> TimeDeltaIndex (GH ...)

pandas/tests/indexes/timedeltas/test_arithmetic.py

+69-31
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ class TestTimedeltaIndexArithmetic(object):
1616
_holder = TimedeltaIndex
1717
_multiprocess_can_split_ = True
1818

19+
# Several ways of representing two hours
20+
two_hour_variants = [pd.offsets.Hour(2), timedelta(hours=2),
21+
np.timedelta64(2, 'h'), Timedelta(hours=2)]
22+
1923
# TODO: Split by ops, better name
2024
def test_numeric_compat(self):
2125
idx = self._holder(np.arange(5, dtype='int64'))
@@ -88,62 +92,96 @@ def test_ufunc_coercions(self):
8892
tm.assert_index_equal(result, exp)
8993
assert result.freq is None
9094

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)]
9795

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)
96+
# -------------------------------------------------------------
97+
# Binary operations TimedeltaIndex and integer
10698

107-
# int
99+
def test_tdi_add_int(self):
108100
rng = timedelta_range('1 days 09:00:00', freq='H', periods=10)
109101
result = rng + 1
110102
expected = timedelta_range('1 days 10:00:00', freq='H', periods=10)
111103
tm.assert_index_equal(result, expected)
104+
105+
def test_tdi_iadd_int(self):
106+
rng = timedelta_range('1 days 09:00:00', freq='H', periods=10)
107+
expected = timedelta_range('1 days 10:00:00', freq='H', periods=10)
112108
rng += 1
113109
tm.assert_index_equal(rng, expected)
114110

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
111+
def test_tdi_sub_int(self):
131112
rng = timedelta_range('1 days 09:00:00', freq='H', periods=10)
132113
result = rng - 1
133114
expected = timedelta_range('1 days 08:00:00', freq='H', periods=10)
134115
tm.assert_index_equal(result, expected)
116+
117+
def test_tdi_isub_int(self):
118+
rng = timedelta_range('1 days 09:00:00', freq='H', periods=10)
119+
expected = timedelta_range('1 days 08:00:00', freq='H', periods=10)
135120
rng -= 1
136121
tm.assert_index_equal(rng, expected)
137122

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

169+
def test_tdi_add_timestamp(self):
170+
idx = TimedeltaIndex(['1 day', '2 day'])
171+
172+
result = idx + Timestamp('2011-01-01')
173+
expected = DatetimeIndex(['2011-01-02', '2011-01-03'])
174+
tm.assert_index_equal(result, expected)
175+
176+
def test_tdi_radd_timestamp(self):
177+
idx = TimedeltaIndex(['1 day', '2 day'])
178+
143179
result = Timestamp('2011-01-01') + idx
144180
expected = DatetimeIndex(['2011-01-02', '2011-01-03'])
145181
tm.assert_index_equal(result, expected)
146182

183+
# -------------------------------------------------------------
184+
147185
# TODO: Split by operation, better name
148186
def test_ops_compat(self):
149187

0 commit comments

Comments
 (0)