Skip to content

Commit edad476

Browse files
jbrockmendel1kastner
authored andcommitted
Move scalar arithmetic tests to tests.scalars (pandas-dev#18075)
1 parent 7691209 commit edad476

File tree

4 files changed

+103
-142
lines changed

4 files changed

+103
-142
lines changed

pandas/tests/indexes/datetimes/test_arithmetic.py

-19
Original file line numberDiff line numberDiff line change
@@ -199,25 +199,6 @@ def test_ufunc_coercions(self):
199199
tm.assert_index_equal(result, exp)
200200
assert result.freq == 'D'
201201

202-
def test_overflow_offset(self):
203-
# xref https://github.com/statsmodels/statsmodels/issues/3374
204-
# ends up multiplying really large numbers which overflow
205-
206-
t = Timestamp('2017-01-13 00:00:00', freq='D')
207-
offset = 20169940 * pd.offsets.Day(1)
208-
209-
def f():
210-
t + offset
211-
pytest.raises(OverflowError, f)
212-
213-
def f():
214-
offset + t
215-
pytest.raises(OverflowError, f)
216-
217-
def f():
218-
t - offset
219-
pytest.raises(OverflowError, f)
220-
221202

222203
# GH 10699
223204
@pytest.mark.parametrize('klass,assert_func', zip([Series, DatetimeIndex],

pandas/tests/indexes/timedeltas/test_arithmetic.py

-123
Original file line numberDiff line numberDiff line change
@@ -51,44 +51,6 @@ def test_numeric_compat(self):
5151
pytest.raises(ValueError, lambda: idx * self._holder(np.arange(3)))
5252
pytest.raises(ValueError, lambda: idx * np.array([1, 2]))
5353

54-
# FIXME: duplicate. This came from `test_timedelta`, whereas the
55-
# version above came from `test_astype`. Make sure there aren't more
56-
# duplicates.
57-
def test_numeric_compat__(self):
58-
59-
idx = self._holder(np.arange(5, dtype='int64'))
60-
didx = self._holder(np.arange(5, dtype='int64') ** 2)
61-
result = idx * 1
62-
tm.assert_index_equal(result, idx)
63-
64-
result = 1 * idx
65-
tm.assert_index_equal(result, idx)
66-
67-
result = idx / 1
68-
tm.assert_index_equal(result, idx)
69-
70-
result = idx // 1
71-
tm.assert_index_equal(result, idx)
72-
73-
result = idx * np.array(5, dtype='int64')
74-
tm.assert_index_equal(result,
75-
self._holder(np.arange(5, dtype='int64') * 5))
76-
77-
result = idx * np.arange(5, dtype='int64')
78-
tm.assert_index_equal(result, didx)
79-
80-
result = idx * Series(np.arange(5, dtype='int64'))
81-
tm.assert_index_equal(result, didx)
82-
83-
result = idx * Series(np.arange(5, dtype='float64') + 0.1)
84-
tm.assert_index_equal(result, self._holder(np.arange(
85-
5, dtype='float64') * (np.arange(5, dtype='float64') + 0.1)))
86-
87-
# invalid
88-
pytest.raises(TypeError, lambda: idx * idx)
89-
pytest.raises(ValueError, lambda: idx * self._holder(np.arange(3)))
90-
pytest.raises(ValueError, lambda: idx * np.array([1, 2]))
91-
9254
def test_ufunc_coercions(self):
9355
# normal ops are also tested in tseries/test_timedeltas.py
9456
idx = TimedeltaIndex(['2H', '4H', '6H', '8H', '10H'],
@@ -406,47 +368,6 @@ def test_addition_ops(self):
406368
expected = Timestamp('20130102')
407369
assert result == expected
408370

409-
# TODO: Split by op, better name
410-
def test_ops(self):
411-
td = Timedelta(10, unit='d')
412-
assert -td == Timedelta(-10, unit='d')
413-
assert +td == Timedelta(10, unit='d')
414-
assert td - td == Timedelta(0, unit='ns')
415-
assert (td - pd.NaT) is pd.NaT
416-
assert td + td == Timedelta(20, unit='d')
417-
assert (td + pd.NaT) is pd.NaT
418-
assert td * 2 == Timedelta(20, unit='d')
419-
assert (td * pd.NaT) is pd.NaT
420-
assert td / 2 == Timedelta(5, unit='d')
421-
assert td // 2 == Timedelta(5, unit='d')
422-
assert abs(td) == td
423-
assert abs(-td) == td
424-
assert td / td == 1
425-
assert (td / pd.NaT) is np.nan
426-
assert (td // pd.NaT) is np.nan
427-
428-
# invert
429-
assert -td == Timedelta('-10d')
430-
assert td * -1 == Timedelta('-10d')
431-
assert -1 * td == Timedelta('-10d')
432-
assert abs(-td) == Timedelta('10d')
433-
434-
# invalid multiply with another timedelta
435-
pytest.raises(TypeError, lambda: td * td)
436-
437-
# can't operate with integers
438-
pytest.raises(TypeError, lambda: td + 2)
439-
pytest.raises(TypeError, lambda: td - 2)
440-
441-
def test_ops_offsets(self):
442-
td = Timedelta(10, unit='d')
443-
assert Timedelta(241, unit='h') == td + pd.offsets.Hour(1)
444-
assert Timedelta(241, unit='h') == pd.offsets.Hour(1) + td
445-
assert 240 == td / pd.offsets.Hour(1)
446-
assert 1 / 240.0 == pd.offsets.Hour(1) / td
447-
assert Timedelta(239, unit='h') == td - pd.offsets.Hour(1)
448-
assert Timedelta(-239, unit='h') == pd.offsets.Hour(1) - td
449-
450371
def test_ops_ndarray(self):
451372
td = Timedelta('1 day')
452373

@@ -530,50 +451,6 @@ def test_ops_series_object(self):
530451
tm.assert_series_equal(s + pd.Timedelta('00:30:00'), exp)
531452
tm.assert_series_equal(pd.Timedelta('00:30:00') + s, exp)
532453

533-
def test_ops_notimplemented(self):
534-
class Other:
535-
pass
536-
537-
other = Other()
538-
539-
td = Timedelta('1 day')
540-
assert td.__add__(other) is NotImplemented
541-
assert td.__sub__(other) is NotImplemented
542-
assert td.__truediv__(other) is NotImplemented
543-
assert td.__mul__(other) is NotImplemented
544-
assert td.__floordiv__(other) is NotImplemented
545-
546-
def test_timedelta_ops_scalar(self):
547-
# GH 6808
548-
base = pd.to_datetime('20130101 09:01:12.123456')
549-
expected_add = pd.to_datetime('20130101 09:01:22.123456')
550-
expected_sub = pd.to_datetime('20130101 09:01:02.123456')
551-
552-
for offset in [pd.to_timedelta(10, unit='s'), timedelta(seconds=10),
553-
np.timedelta64(10, 's'),
554-
np.timedelta64(10000000000, 'ns'),
555-
pd.offsets.Second(10)]:
556-
result = base + offset
557-
assert result == expected_add
558-
559-
result = base - offset
560-
assert result == expected_sub
561-
562-
base = pd.to_datetime('20130102 09:01:12.123456')
563-
expected_add = pd.to_datetime('20130103 09:01:22.123456')
564-
expected_sub = pd.to_datetime('20130101 09:01:02.123456')
565-
566-
for offset in [pd.to_timedelta('1 day, 00:00:10'),
567-
pd.to_timedelta('1 days, 00:00:10'),
568-
timedelta(days=1, seconds=10),
569-
np.timedelta64(1, 'D') + np.timedelta64(10, 's'),
570-
pd.offsets.Day() + pd.offsets.Second(10)]:
571-
result = base + offset
572-
assert result == expected_add
573-
574-
result = base - offset
575-
assert result == expected_sub
576-
577454
def test_timedelta_ops_with_missing_values(self):
578455
# setup
579456
s1 = pd.to_timedelta(Series(['00:00:01']))

pandas/tests/scalar/test_timedelta.py

+85
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,91 @@ def test_to_timedelta_on_nanoseconds(self):
4040

4141
pytest.raises(TypeError, lambda: Timedelta(nanoseconds='abc'))
4242

43+
def test_ops_notimplemented(self):
44+
class Other:
45+
pass
46+
47+
other = Other()
48+
49+
td = Timedelta('1 day')
50+
assert td.__add__(other) is NotImplemented
51+
assert td.__sub__(other) is NotImplemented
52+
assert td.__truediv__(other) is NotImplemented
53+
assert td.__mul__(other) is NotImplemented
54+
assert td.__floordiv__(other) is NotImplemented
55+
56+
def test_timedelta_ops_scalar(self):
57+
# GH 6808
58+
base = pd.to_datetime('20130101 09:01:12.123456')
59+
expected_add = pd.to_datetime('20130101 09:01:22.123456')
60+
expected_sub = pd.to_datetime('20130101 09:01:02.123456')
61+
62+
for offset in [pd.to_timedelta(10, unit='s'), timedelta(seconds=10),
63+
np.timedelta64(10, 's'),
64+
np.timedelta64(10000000000, 'ns'),
65+
pd.offsets.Second(10)]:
66+
result = base + offset
67+
assert result == expected_add
68+
69+
result = base - offset
70+
assert result == expected_sub
71+
72+
base = pd.to_datetime('20130102 09:01:12.123456')
73+
expected_add = pd.to_datetime('20130103 09:01:22.123456')
74+
expected_sub = pd.to_datetime('20130101 09:01:02.123456')
75+
76+
for offset in [pd.to_timedelta('1 day, 00:00:10'),
77+
pd.to_timedelta('1 days, 00:00:10'),
78+
timedelta(days=1, seconds=10),
79+
np.timedelta64(1, 'D') + np.timedelta64(10, 's'),
80+
pd.offsets.Day() + pd.offsets.Second(10)]:
81+
result = base + offset
82+
assert result == expected_add
83+
84+
result = base - offset
85+
assert result == expected_sub
86+
87+
def test_ops_offsets(self):
88+
td = Timedelta(10, unit='d')
89+
assert Timedelta(241, unit='h') == td + pd.offsets.Hour(1)
90+
assert Timedelta(241, unit='h') == pd.offsets.Hour(1) + td
91+
assert 240 == td / pd.offsets.Hour(1)
92+
assert 1 / 240.0 == pd.offsets.Hour(1) / td
93+
assert Timedelta(239, unit='h') == td - pd.offsets.Hour(1)
94+
assert Timedelta(-239, unit='h') == pd.offsets.Hour(1) - td
95+
96+
# TODO: Split by op, better name
97+
def test_ops(self):
98+
td = Timedelta(10, unit='d')
99+
assert -td == Timedelta(-10, unit='d')
100+
assert +td == Timedelta(10, unit='d')
101+
assert td - td == Timedelta(0, unit='ns')
102+
assert (td - pd.NaT) is pd.NaT
103+
assert td + td == Timedelta(20, unit='d')
104+
assert (td + pd.NaT) is pd.NaT
105+
assert td * 2 == Timedelta(20, unit='d')
106+
assert (td * pd.NaT) is pd.NaT
107+
assert td / 2 == Timedelta(5, unit='d')
108+
assert td // 2 == Timedelta(5, unit='d')
109+
assert abs(td) == td
110+
assert abs(-td) == td
111+
assert td / td == 1
112+
assert (td / pd.NaT) is np.nan
113+
assert (td // pd.NaT) is np.nan
114+
115+
# invert
116+
assert -td == Timedelta('-10d')
117+
assert td * -1 == Timedelta('-10d')
118+
assert -1 * td == Timedelta('-10d')
119+
assert abs(-td) == Timedelta('10d')
120+
121+
# invalid multiply with another timedelta
122+
pytest.raises(TypeError, lambda: td * td)
123+
124+
# can't operate with integers
125+
pytest.raises(TypeError, lambda: td + 2)
126+
pytest.raises(TypeError, lambda: td - 2)
127+
43128

44129
class TestTimedeltas(object):
45130
_multiprocess_can_split_ = True

pandas/tests/scalar/test_timestamp.py

+18
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,24 @@
2828
RESO_MS, RESO_SEC)
2929

3030

31+
class TestTimestampArithmetic(object):
32+
def test_overflow_offset(self):
33+
# xref https://github.com/statsmodels/statsmodels/issues/3374
34+
# ends up multiplying really large numbers which overflow
35+
36+
stamp = Timestamp('2017-01-13 00:00:00', freq='D')
37+
offset = 20169940 * offsets.Day(1)
38+
39+
with pytest.raises(OverflowError):
40+
stamp + offset
41+
42+
with pytest.raises(OverflowError):
43+
offset + stamp
44+
45+
with pytest.raises(OverflowError):
46+
stamp - offset
47+
48+
3149
class TestTimestamp(object):
3250

3351
def test_constructor(self):

0 commit comments

Comments
 (0)