From b4440617fddd1329666f39747e50c3763886ab65 Mon Sep 17 00:00:00 2001 From: Brock Mendel Date: Sun, 5 Nov 2017 21:00:35 -0800 Subject: [PATCH 01/12] parametrize the first few arithmetic tests --- .../indexes/datetimes/test_arithmetic.py | 143 +++++++++++------- .../indexes/timedeltas/test_arithmetic.py | 100 ++++++++---- 2 files changed, 161 insertions(+), 82 deletions(-) diff --git a/pandas/tests/indexes/datetimes/test_arithmetic.py b/pandas/tests/indexes/datetimes/test_arithmetic.py index e078413c9398c..ba2e5d7289f60 100644 --- a/pandas/tests/indexes/datetimes/test_arithmetic.py +++ b/pandas/tests/indexes/datetimes/test_arithmetic.py @@ -14,70 +14,109 @@ date_range) + class TestDatetimeIndexArithmetic(object): tz = [None, 'UTC', 'Asia/Tokyo', 'US/Eastern', 'dateutil/Asia/Singapore', 'dateutil/US/Pacific'] - def test_add_iadd(self): - for tz in self.tz: - - # offset - offsets = [pd.offsets.Hour(2), timedelta(hours=2), - np.timedelta64(2, 'h'), Timedelta(hours=2)] - - for delta in offsets: - rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz) - result = rng + delta - expected = pd.date_range('2000-01-01 02:00', - '2000-02-01 02:00', tz=tz) - tm.assert_index_equal(result, expected) - rng += delta - tm.assert_index_equal(rng, expected) - - # int - rng = pd.date_range('2000-01-01 09:00', freq='H', periods=10, - tz=tz) - result = rng + 1 - expected = pd.date_range('2000-01-01 10:00', freq='H', periods=10, - tz=tz) - tm.assert_index_equal(result, expected) - rng += 1 - tm.assert_index_equal(rng, expected) + # Several ways of representing two hours + two_hour_variants = [pd.offsets.Hour(2), timedelta(hours=2), + np.timedelta64(2, 'h'), Timedelta(hours=2)] + def test_dti_add_timestamp_raises(self): idx = DatetimeIndex(['2011-01-01', '2011-01-02']) msg = "cannot add DatetimeIndex and Timestamp" with tm.assert_raises_regex(TypeError, msg): idx + Timestamp('2011-01-01') + def test_dti_radd_timestamp_raises(self): + idx = DatetimeIndex(['2011-01-01', '2011-01-02']) + msg = "cannot add DatetimeIndex and Timestamp" with tm.assert_raises_regex(TypeError, msg): Timestamp('2011-01-01') + idx - def test_sub_isub(self): - for tz in self.tz: - - # offset - offsets = [pd.offsets.Hour(2), timedelta(hours=2), - np.timedelta64(2, 'h'), Timedelta(hours=2)] - - for delta in offsets: - rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz) - expected = pd.date_range('1999-12-31 22:00', - '2000-01-31 22:00', tz=tz) - - result = rng - delta - tm.assert_index_equal(result, expected) - rng -= delta - tm.assert_index_equal(rng, expected) - - # int - rng = pd.date_range('2000-01-01 09:00', freq='H', periods=10, - tz=tz) - result = rng - 1 - expected = pd.date_range('2000-01-01 08:00', freq='H', periods=10, - tz=tz) - tm.assert_index_equal(result, expected) - rng -= 1 - tm.assert_index_equal(rng, expected) + # ------------------------------------------------------------- + # Binary operations DatetimeIndex and int + + @pytest.mark.parametrize('tz', tz) + def test_dti_add_int(self, tz): + rng = pd.date_range('2000-01-01 09:00', freq='H', + periods=10, tz=tz) + result = rng + 1 + expected = pd.date_range('2000-01-01 10:00', freq='H', + periods=10, tz=tz) + tm.assert_index_equal(result, expected) + + @pytest.mark.parametrize('tz', tz) + def test_dti_iadd_int(self, tz): + rng = pd.date_range('2000-01-01 09:00', freq='H', + periods=10, tz=tz) + expected = pd.date_range('2000-01-01 10:00', freq='H', + periods=10, tz=tz) + rng += 1 + tm.assert_index_equal(rng, expected) + + @pytest.mark.parametrize('tz', tz) + def test_dti_sub_int(self): + rng = pd.date_range('2000-01-01 09:00', freq='H', + periods=10, tz=tz) + result = rng - 1 + expected = pd.date_range('2000-01-01 08:00', freq='H', + periods=10, tz=tz) + tm.assert_index_equal(result, expected) + + @pytest.mark.parametrize('tz', tz) + def test_dti_isub_int(self): + rng = pd.date_range('2000-01-01 09:00', freq='H', + periods=10, tz=tz) + expected = pd.date_range('2000-01-01 08:00', freq='H', + periods=10, tz=tz) + rng -= 1 + tm.assert_index_equal(rng, expected) + + # ------------------------------------------------------------- + # Binary operations DatetimeIndex and timedelta-like + + @pytest.mark.parametrize('delta', two_hour_variants) + @pytest.mark.parametrize('tz', tz) + def test_dti_add_timedeltalike(self, tz): + rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz) + result = rng + delta + expected = pd.date_range('2000-01-01 02:00', + '2000-02-01 02:00', tz=tz) + tm.assert_index_equal(result, expected) + + @pytest.mark.parametrize('delta', two_hour_variants) + @pytest.mark.parametrize('tz', tz) + def test_dti_iadd_timedeltalike(self, tz): + rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz) + expected = pd.date_range('2000-01-01 02:00', + '2000-02-01 02:00', tz=tz) + rng += delta + tm.assert_index_equal(rng, expected) + + @pytest.mark.parametrize('delta', two_hour_variants) + @pytest.mark.parametrize('tz', tz) + def test_dti_sub_timedeltalike(self, tz): + rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz) + expected = pd.date_range('1999-12-31 22:00', + '2000-01-31 22:00', tz=tz) + result = rng - delta + tm.assert_index_equal(result, expected) + + @pytest.mark.parametrize('delta', two_hour_variants) + @pytest.mark.parametrize('tz', tz) + def test_dti_isub_timedeltalike(self, tz): + rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz) + expected = pd.date_range('1999-12-31 22:00', + '2000-01-31 22:00', tz=tz) + rng -= delta + tm.assert_index_equal(rng, expected) + + # ------------------------------------------------------------- + # Binary Operations DatetimeIndex and datetime-like + # TODO: A couple other tests belong in this section. Move them in + # A PR where there isn't already a giant diff. @pytest.mark.parametrize('addend', [ datetime(2011, 1, 1), @@ -112,6 +151,8 @@ def test_add_datetimelike_and_dti_tz(self, addend): with tm.assert_raises_regex(TypeError, msg): addend + dti_tz + # ------------------------------------------------------------- + def test_sub_dti_dti(self): # previously performed setop (deprecated in 0.16.0), now changed to # return subtraction -> TimeDeltaIndex (GH ...) diff --git a/pandas/tests/indexes/timedeltas/test_arithmetic.py b/pandas/tests/indexes/timedeltas/test_arithmetic.py index 514702e15f7e1..16f1b6506aa86 100644 --- a/pandas/tests/indexes/timedeltas/test_arithmetic.py +++ b/pandas/tests/indexes/timedeltas/test_arithmetic.py @@ -16,6 +16,10 @@ class TestTimedeltaIndexArithmetic(object): _holder = TimedeltaIndex _multiprocess_can_split_ = True + # Several ways of representing two hours + two_hour_variants = [pd.offsets.Hour(2), timedelta(hours=2), + np.timedelta64(2, 'h'), Timedelta(hours=2)] + # TODO: Split by ops, better name def test_numeric_compat(self): idx = self._holder(np.arange(5, dtype='int64')) @@ -88,62 +92,96 @@ def test_ufunc_coercions(self): tm.assert_index_equal(result, exp) assert result.freq is None - def test_add_iadd(self): - # only test adding/sub offsets as + is now numeric - - # offset - offsets = [pd.offsets.Hour(2), timedelta(hours=2), - np.timedelta64(2, 'h'), Timedelta(hours=2)] - for delta in offsets: - rng = timedelta_range('1 days', '10 days') - result = rng + delta - expected = timedelta_range('1 days 02:00:00', '10 days 02:00:00', - freq='D') - tm.assert_index_equal(result, expected) - rng += delta - tm.assert_index_equal(rng, expected) + # ------------------------------------------------------------- + # Binary operations TimedeltaIndex and integer - # int + def test_tdi_add_int(self): rng = timedelta_range('1 days 09:00:00', freq='H', periods=10) result = rng + 1 expected = timedelta_range('1 days 10:00:00', freq='H', periods=10) tm.assert_index_equal(result, expected) + + def test_tdi_iadd_int(self): + rng = timedelta_range('1 days 09:00:00', freq='H', periods=10) + expected = timedelta_range('1 days 10:00:00', freq='H', periods=10) rng += 1 tm.assert_index_equal(rng, expected) - def test_sub_isub(self): - # only test adding/sub offsets as - is now numeric - - # offset - offsets = [pd.offsets.Hour(2), timedelta(hours=2), - np.timedelta64(2, 'h'), Timedelta(hours=2)] - - for delta in offsets: - rng = timedelta_range('1 days', '10 days') - result = rng - delta - expected = timedelta_range('0 days 22:00:00', '9 days 22:00:00') - tm.assert_index_equal(result, expected) - rng -= delta - tm.assert_index_equal(rng, expected) - - # int + def test_tdi_sub_int(self): rng = timedelta_range('1 days 09:00:00', freq='H', periods=10) result = rng - 1 expected = timedelta_range('1 days 08:00:00', freq='H', periods=10) tm.assert_index_equal(result, expected) + + def test_tdi_isub_int(self): + rng = timedelta_range('1 days 09:00:00', freq='H', periods=10) + expected = timedelta_range('1 days 08:00:00', freq='H', periods=10) rng -= 1 tm.assert_index_equal(rng, expected) + # ------------------------------------------------------------- + # Binary operations TimedeltaIndex and timedelta-like + + @pytest.mark.parametrize('delta', two_hour_variants) + def test_tdi_add_timedeltalike(self, delta): + # only test adding/sub offsets as + is now numeric + rng = timedelta_range('1 days', '10 days') + result = rng + delta + expected = timedelta_range('1 days 02:00:00', '10 days 02:00:00', + freq='D') + tm.assert_index_equal(result, expected) + + @pytest.mark.parametrize('delta', two_hour_variants) + def test_tdi_iadd_timedeltalike(self, delta): + # only test adding/sub offsets as + is now numeric + rng = timedelta_range('1 days', '10 days') + expected = timedelta_range('1 days 02:00:00', '10 days 02:00:00', + freq='D') + rng += delta + tm.assert_index_equal(rng, expected) + + @pytest.mark.parametrize('delta', two_hour_variants) + def test_tdi_sub_timedeltalike(self, delta): + # only test adding/sub offsets as - is now numeric + rng = timedelta_range('1 days', '10 days') + result = rng - delta + expected = timedelta_range('0 days 22:00:00', '9 days 22:00:00') + tm.assert_index_equal(result, expected) + + @pytest.mark.parametrize('delta', two_hour_variants) + def test_tdi_isub_timedeltalike(self, delta): + # only test adding/sub offsets as - is now numeric + rng = timedelta_range('1 days', '10 days') + expected = timedelta_range('0 days 22:00:00', '9 days 22:00:00') + rng -= delta + tm.assert_index_equal(rng, expected) + + # ------------------------------------------------------------- + # Binary operations TimedeltaIndex and datetime-like + + def test_tdi_sub_timestamp_raises(self): idx = TimedeltaIndex(['1 day', '2 day']) msg = "cannot subtract a datelike from a TimedeltaIndex" with tm.assert_raises_regex(TypeError, msg): idx - Timestamp('2011-01-01') + def test_tdi_add_timestamp(self): + idx = TimedeltaIndex(['1 day', '2 day']) + + result = idx + Timestamp('2011-01-01') + expected = DatetimeIndex(['2011-01-02', '2011-01-03']) + tm.assert_index_equal(result, expected) + + def test_tdi_radd_timestamp(self): + idx = TimedeltaIndex(['1 day', '2 day']) + result = Timestamp('2011-01-01') + idx expected = DatetimeIndex(['2011-01-02', '2011-01-03']) tm.assert_index_equal(result, expected) + # ------------------------------------------------------------- + # TODO: Split by operation, better name def test_ops_compat(self): From 29ecf6cbc97d787f5313e7b73379a5ebd0ad7313 Mon Sep 17 00:00:00 2001 From: Brock Mendel Date: Sun, 5 Nov 2017 21:04:36 -0800 Subject: [PATCH 02/12] whitespace fixup --- pandas/tests/indexes/timedeltas/test_arithmetic.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pandas/tests/indexes/timedeltas/test_arithmetic.py b/pandas/tests/indexes/timedeltas/test_arithmetic.py index 16f1b6506aa86..be4859c4c7241 100644 --- a/pandas/tests/indexes/timedeltas/test_arithmetic.py +++ b/pandas/tests/indexes/timedeltas/test_arithmetic.py @@ -92,7 +92,6 @@ def test_ufunc_coercions(self): tm.assert_index_equal(result, exp) assert result.freq is None - # ------------------------------------------------------------- # Binary operations TimedeltaIndex and integer From 7736dd7e1d83be2b36ae9bcf797b70bf63ddf061 Mon Sep 17 00:00:00 2001 From: Brock Mendel Date: Mon, 6 Nov 2017 07:55:02 -0800 Subject: [PATCH 03/12] fix missing params --- pandas/tests/indexes/datetimes/test_arithmetic.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/tests/indexes/datetimes/test_arithmetic.py b/pandas/tests/indexes/datetimes/test_arithmetic.py index ba2e5d7289f60..40f0d88f9c391 100644 --- a/pandas/tests/indexes/datetimes/test_arithmetic.py +++ b/pandas/tests/indexes/datetimes/test_arithmetic.py @@ -66,7 +66,7 @@ def test_dti_sub_int(self): tm.assert_index_equal(result, expected) @pytest.mark.parametrize('tz', tz) - def test_dti_isub_int(self): + def test_dti_isub_int(self, tz): rng = pd.date_range('2000-01-01 09:00', freq='H', periods=10, tz=tz) expected = pd.date_range('2000-01-01 08:00', freq='H', @@ -79,7 +79,7 @@ def test_dti_isub_int(self): @pytest.mark.parametrize('delta', two_hour_variants) @pytest.mark.parametrize('tz', tz) - def test_dti_add_timedeltalike(self, tz): + def test_dti_add_timedeltalike(self, tz, delta): rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz) result = rng + delta expected = pd.date_range('2000-01-01 02:00', From 536c160ab018eec896d84033b595cea197ba488c Mon Sep 17 00:00:00 2001 From: Brock Mendel Date: Mon, 6 Nov 2017 09:45:53 -0800 Subject: [PATCH 04/12] fix parametrization screwup --- pandas/tests/indexes/datetimes/test_arithmetic.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pandas/tests/indexes/datetimes/test_arithmetic.py b/pandas/tests/indexes/datetimes/test_arithmetic.py index 40f0d88f9c391..cb608cfe0e8a1 100644 --- a/pandas/tests/indexes/datetimes/test_arithmetic.py +++ b/pandas/tests/indexes/datetimes/test_arithmetic.py @@ -57,7 +57,7 @@ def test_dti_iadd_int(self, tz): tm.assert_index_equal(rng, expected) @pytest.mark.parametrize('tz', tz) - def test_dti_sub_int(self): + def test_dti_sub_int(self, tz): rng = pd.date_range('2000-01-01 09:00', freq='H', periods=10, tz=tz) result = rng - 1 @@ -88,7 +88,7 @@ def test_dti_add_timedeltalike(self, tz, delta): @pytest.mark.parametrize('delta', two_hour_variants) @pytest.mark.parametrize('tz', tz) - def test_dti_iadd_timedeltalike(self, tz): + def test_dti_iadd_timedeltalike(self, tz, delta): rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz) expected = pd.date_range('2000-01-01 02:00', '2000-02-01 02:00', tz=tz) @@ -97,7 +97,7 @@ def test_dti_iadd_timedeltalike(self, tz): @pytest.mark.parametrize('delta', two_hour_variants) @pytest.mark.parametrize('tz', tz) - def test_dti_sub_timedeltalike(self, tz): + def test_dti_sub_timedeltalike(self, tz, delta): rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz) expected = pd.date_range('1999-12-31 22:00', '2000-01-31 22:00', tz=tz) @@ -106,7 +106,7 @@ def test_dti_sub_timedeltalike(self, tz): @pytest.mark.parametrize('delta', two_hour_variants) @pytest.mark.parametrize('tz', tz) - def test_dti_isub_timedeltalike(self, tz): + def test_dti_isub_timedeltalike(self, tz, delta): rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz) expected = pd.date_range('1999-12-31 22:00', '2000-01-31 22:00', tz=tz) From 7360f87040eff7ac819c775db845ffca37dd6beb Mon Sep 17 00:00:00 2001 From: Brock Mendel Date: Mon, 6 Nov 2017 12:07:22 -0800 Subject: [PATCH 05/12] whitespace fixup --- pandas/tests/indexes/datetimes/test_arithmetic.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pandas/tests/indexes/datetimes/test_arithmetic.py b/pandas/tests/indexes/datetimes/test_arithmetic.py index cb608cfe0e8a1..cfe29925f933f 100644 --- a/pandas/tests/indexes/datetimes/test_arithmetic.py +++ b/pandas/tests/indexes/datetimes/test_arithmetic.py @@ -14,7 +14,6 @@ date_range) - class TestDatetimeIndexArithmetic(object): tz = [None, 'UTC', 'Asia/Tokyo', 'US/Eastern', 'dateutil/Asia/Singapore', 'dateutil/US/Pacific'] From e3e15ea4e00b11b0003c1076a05ae73926aa0077 Mon Sep 17 00:00:00 2001 From: Brock Mendel Date: Sun, 5 Nov 2017 21:00:35 -0800 Subject: [PATCH 06/12] parametrize the first few arithmetic tests --- .../indexes/datetimes/test_arithmetic.py | 143 +++++++++++------- .../indexes/timedeltas/test_arithmetic.py | 100 ++++++++---- 2 files changed, 161 insertions(+), 82 deletions(-) diff --git a/pandas/tests/indexes/datetimes/test_arithmetic.py b/pandas/tests/indexes/datetimes/test_arithmetic.py index e078413c9398c..ba2e5d7289f60 100644 --- a/pandas/tests/indexes/datetimes/test_arithmetic.py +++ b/pandas/tests/indexes/datetimes/test_arithmetic.py @@ -14,70 +14,109 @@ date_range) + class TestDatetimeIndexArithmetic(object): tz = [None, 'UTC', 'Asia/Tokyo', 'US/Eastern', 'dateutil/Asia/Singapore', 'dateutil/US/Pacific'] - def test_add_iadd(self): - for tz in self.tz: - - # offset - offsets = [pd.offsets.Hour(2), timedelta(hours=2), - np.timedelta64(2, 'h'), Timedelta(hours=2)] - - for delta in offsets: - rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz) - result = rng + delta - expected = pd.date_range('2000-01-01 02:00', - '2000-02-01 02:00', tz=tz) - tm.assert_index_equal(result, expected) - rng += delta - tm.assert_index_equal(rng, expected) - - # int - rng = pd.date_range('2000-01-01 09:00', freq='H', periods=10, - tz=tz) - result = rng + 1 - expected = pd.date_range('2000-01-01 10:00', freq='H', periods=10, - tz=tz) - tm.assert_index_equal(result, expected) - rng += 1 - tm.assert_index_equal(rng, expected) + # Several ways of representing two hours + two_hour_variants = [pd.offsets.Hour(2), timedelta(hours=2), + np.timedelta64(2, 'h'), Timedelta(hours=2)] + def test_dti_add_timestamp_raises(self): idx = DatetimeIndex(['2011-01-01', '2011-01-02']) msg = "cannot add DatetimeIndex and Timestamp" with tm.assert_raises_regex(TypeError, msg): idx + Timestamp('2011-01-01') + def test_dti_radd_timestamp_raises(self): + idx = DatetimeIndex(['2011-01-01', '2011-01-02']) + msg = "cannot add DatetimeIndex and Timestamp" with tm.assert_raises_regex(TypeError, msg): Timestamp('2011-01-01') + idx - def test_sub_isub(self): - for tz in self.tz: - - # offset - offsets = [pd.offsets.Hour(2), timedelta(hours=2), - np.timedelta64(2, 'h'), Timedelta(hours=2)] - - for delta in offsets: - rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz) - expected = pd.date_range('1999-12-31 22:00', - '2000-01-31 22:00', tz=tz) - - result = rng - delta - tm.assert_index_equal(result, expected) - rng -= delta - tm.assert_index_equal(rng, expected) - - # int - rng = pd.date_range('2000-01-01 09:00', freq='H', periods=10, - tz=tz) - result = rng - 1 - expected = pd.date_range('2000-01-01 08:00', freq='H', periods=10, - tz=tz) - tm.assert_index_equal(result, expected) - rng -= 1 - tm.assert_index_equal(rng, expected) + # ------------------------------------------------------------- + # Binary operations DatetimeIndex and int + + @pytest.mark.parametrize('tz', tz) + def test_dti_add_int(self, tz): + rng = pd.date_range('2000-01-01 09:00', freq='H', + periods=10, tz=tz) + result = rng + 1 + expected = pd.date_range('2000-01-01 10:00', freq='H', + periods=10, tz=tz) + tm.assert_index_equal(result, expected) + + @pytest.mark.parametrize('tz', tz) + def test_dti_iadd_int(self, tz): + rng = pd.date_range('2000-01-01 09:00', freq='H', + periods=10, tz=tz) + expected = pd.date_range('2000-01-01 10:00', freq='H', + periods=10, tz=tz) + rng += 1 + tm.assert_index_equal(rng, expected) + + @pytest.mark.parametrize('tz', tz) + def test_dti_sub_int(self): + rng = pd.date_range('2000-01-01 09:00', freq='H', + periods=10, tz=tz) + result = rng - 1 + expected = pd.date_range('2000-01-01 08:00', freq='H', + periods=10, tz=tz) + tm.assert_index_equal(result, expected) + + @pytest.mark.parametrize('tz', tz) + def test_dti_isub_int(self): + rng = pd.date_range('2000-01-01 09:00', freq='H', + periods=10, tz=tz) + expected = pd.date_range('2000-01-01 08:00', freq='H', + periods=10, tz=tz) + rng -= 1 + tm.assert_index_equal(rng, expected) + + # ------------------------------------------------------------- + # Binary operations DatetimeIndex and timedelta-like + + @pytest.mark.parametrize('delta', two_hour_variants) + @pytest.mark.parametrize('tz', tz) + def test_dti_add_timedeltalike(self, tz): + rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz) + result = rng + delta + expected = pd.date_range('2000-01-01 02:00', + '2000-02-01 02:00', tz=tz) + tm.assert_index_equal(result, expected) + + @pytest.mark.parametrize('delta', two_hour_variants) + @pytest.mark.parametrize('tz', tz) + def test_dti_iadd_timedeltalike(self, tz): + rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz) + expected = pd.date_range('2000-01-01 02:00', + '2000-02-01 02:00', tz=tz) + rng += delta + tm.assert_index_equal(rng, expected) + + @pytest.mark.parametrize('delta', two_hour_variants) + @pytest.mark.parametrize('tz', tz) + def test_dti_sub_timedeltalike(self, tz): + rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz) + expected = pd.date_range('1999-12-31 22:00', + '2000-01-31 22:00', tz=tz) + result = rng - delta + tm.assert_index_equal(result, expected) + + @pytest.mark.parametrize('delta', two_hour_variants) + @pytest.mark.parametrize('tz', tz) + def test_dti_isub_timedeltalike(self, tz): + rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz) + expected = pd.date_range('1999-12-31 22:00', + '2000-01-31 22:00', tz=tz) + rng -= delta + tm.assert_index_equal(rng, expected) + + # ------------------------------------------------------------- + # Binary Operations DatetimeIndex and datetime-like + # TODO: A couple other tests belong in this section. Move them in + # A PR where there isn't already a giant diff. @pytest.mark.parametrize('addend', [ datetime(2011, 1, 1), @@ -112,6 +151,8 @@ def test_add_datetimelike_and_dti_tz(self, addend): with tm.assert_raises_regex(TypeError, msg): addend + dti_tz + # ------------------------------------------------------------- + def test_sub_dti_dti(self): # previously performed setop (deprecated in 0.16.0), now changed to # return subtraction -> TimeDeltaIndex (GH ...) diff --git a/pandas/tests/indexes/timedeltas/test_arithmetic.py b/pandas/tests/indexes/timedeltas/test_arithmetic.py index 514702e15f7e1..16f1b6506aa86 100644 --- a/pandas/tests/indexes/timedeltas/test_arithmetic.py +++ b/pandas/tests/indexes/timedeltas/test_arithmetic.py @@ -16,6 +16,10 @@ class TestTimedeltaIndexArithmetic(object): _holder = TimedeltaIndex _multiprocess_can_split_ = True + # Several ways of representing two hours + two_hour_variants = [pd.offsets.Hour(2), timedelta(hours=2), + np.timedelta64(2, 'h'), Timedelta(hours=2)] + # TODO: Split by ops, better name def test_numeric_compat(self): idx = self._holder(np.arange(5, dtype='int64')) @@ -88,62 +92,96 @@ def test_ufunc_coercions(self): tm.assert_index_equal(result, exp) assert result.freq is None - def test_add_iadd(self): - # only test adding/sub offsets as + is now numeric - - # offset - offsets = [pd.offsets.Hour(2), timedelta(hours=2), - np.timedelta64(2, 'h'), Timedelta(hours=2)] - for delta in offsets: - rng = timedelta_range('1 days', '10 days') - result = rng + delta - expected = timedelta_range('1 days 02:00:00', '10 days 02:00:00', - freq='D') - tm.assert_index_equal(result, expected) - rng += delta - tm.assert_index_equal(rng, expected) + # ------------------------------------------------------------- + # Binary operations TimedeltaIndex and integer - # int + def test_tdi_add_int(self): rng = timedelta_range('1 days 09:00:00', freq='H', periods=10) result = rng + 1 expected = timedelta_range('1 days 10:00:00', freq='H', periods=10) tm.assert_index_equal(result, expected) + + def test_tdi_iadd_int(self): + rng = timedelta_range('1 days 09:00:00', freq='H', periods=10) + expected = timedelta_range('1 days 10:00:00', freq='H', periods=10) rng += 1 tm.assert_index_equal(rng, expected) - def test_sub_isub(self): - # only test adding/sub offsets as - is now numeric - - # offset - offsets = [pd.offsets.Hour(2), timedelta(hours=2), - np.timedelta64(2, 'h'), Timedelta(hours=2)] - - for delta in offsets: - rng = timedelta_range('1 days', '10 days') - result = rng - delta - expected = timedelta_range('0 days 22:00:00', '9 days 22:00:00') - tm.assert_index_equal(result, expected) - rng -= delta - tm.assert_index_equal(rng, expected) - - # int + def test_tdi_sub_int(self): rng = timedelta_range('1 days 09:00:00', freq='H', periods=10) result = rng - 1 expected = timedelta_range('1 days 08:00:00', freq='H', periods=10) tm.assert_index_equal(result, expected) + + def test_tdi_isub_int(self): + rng = timedelta_range('1 days 09:00:00', freq='H', periods=10) + expected = timedelta_range('1 days 08:00:00', freq='H', periods=10) rng -= 1 tm.assert_index_equal(rng, expected) + # ------------------------------------------------------------- + # Binary operations TimedeltaIndex and timedelta-like + + @pytest.mark.parametrize('delta', two_hour_variants) + def test_tdi_add_timedeltalike(self, delta): + # only test adding/sub offsets as + is now numeric + rng = timedelta_range('1 days', '10 days') + result = rng + delta + expected = timedelta_range('1 days 02:00:00', '10 days 02:00:00', + freq='D') + tm.assert_index_equal(result, expected) + + @pytest.mark.parametrize('delta', two_hour_variants) + def test_tdi_iadd_timedeltalike(self, delta): + # only test adding/sub offsets as + is now numeric + rng = timedelta_range('1 days', '10 days') + expected = timedelta_range('1 days 02:00:00', '10 days 02:00:00', + freq='D') + rng += delta + tm.assert_index_equal(rng, expected) + + @pytest.mark.parametrize('delta', two_hour_variants) + def test_tdi_sub_timedeltalike(self, delta): + # only test adding/sub offsets as - is now numeric + rng = timedelta_range('1 days', '10 days') + result = rng - delta + expected = timedelta_range('0 days 22:00:00', '9 days 22:00:00') + tm.assert_index_equal(result, expected) + + @pytest.mark.parametrize('delta', two_hour_variants) + def test_tdi_isub_timedeltalike(self, delta): + # only test adding/sub offsets as - is now numeric + rng = timedelta_range('1 days', '10 days') + expected = timedelta_range('0 days 22:00:00', '9 days 22:00:00') + rng -= delta + tm.assert_index_equal(rng, expected) + + # ------------------------------------------------------------- + # Binary operations TimedeltaIndex and datetime-like + + def test_tdi_sub_timestamp_raises(self): idx = TimedeltaIndex(['1 day', '2 day']) msg = "cannot subtract a datelike from a TimedeltaIndex" with tm.assert_raises_regex(TypeError, msg): idx - Timestamp('2011-01-01') + def test_tdi_add_timestamp(self): + idx = TimedeltaIndex(['1 day', '2 day']) + + result = idx + Timestamp('2011-01-01') + expected = DatetimeIndex(['2011-01-02', '2011-01-03']) + tm.assert_index_equal(result, expected) + + def test_tdi_radd_timestamp(self): + idx = TimedeltaIndex(['1 day', '2 day']) + result = Timestamp('2011-01-01') + idx expected = DatetimeIndex(['2011-01-02', '2011-01-03']) tm.assert_index_equal(result, expected) + # ------------------------------------------------------------- + # TODO: Split by operation, better name def test_ops_compat(self): From 3acabb75cd8d5ec3068bc56876072e8f53ead0dd Mon Sep 17 00:00:00 2001 From: Brock Mendel Date: Sun, 5 Nov 2017 21:04:36 -0800 Subject: [PATCH 07/12] whitespace fixup --- pandas/tests/indexes/timedeltas/test_arithmetic.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pandas/tests/indexes/timedeltas/test_arithmetic.py b/pandas/tests/indexes/timedeltas/test_arithmetic.py index 16f1b6506aa86..be4859c4c7241 100644 --- a/pandas/tests/indexes/timedeltas/test_arithmetic.py +++ b/pandas/tests/indexes/timedeltas/test_arithmetic.py @@ -92,7 +92,6 @@ def test_ufunc_coercions(self): tm.assert_index_equal(result, exp) assert result.freq is None - # ------------------------------------------------------------- # Binary operations TimedeltaIndex and integer From c5709e493368b406726d13019cd0748256c7523b Mon Sep 17 00:00:00 2001 From: Brock Mendel Date: Mon, 6 Nov 2017 07:55:02 -0800 Subject: [PATCH 08/12] fix missing params --- pandas/tests/indexes/datetimes/test_arithmetic.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/tests/indexes/datetimes/test_arithmetic.py b/pandas/tests/indexes/datetimes/test_arithmetic.py index ba2e5d7289f60..40f0d88f9c391 100644 --- a/pandas/tests/indexes/datetimes/test_arithmetic.py +++ b/pandas/tests/indexes/datetimes/test_arithmetic.py @@ -66,7 +66,7 @@ def test_dti_sub_int(self): tm.assert_index_equal(result, expected) @pytest.mark.parametrize('tz', tz) - def test_dti_isub_int(self): + def test_dti_isub_int(self, tz): rng = pd.date_range('2000-01-01 09:00', freq='H', periods=10, tz=tz) expected = pd.date_range('2000-01-01 08:00', freq='H', @@ -79,7 +79,7 @@ def test_dti_isub_int(self): @pytest.mark.parametrize('delta', two_hour_variants) @pytest.mark.parametrize('tz', tz) - def test_dti_add_timedeltalike(self, tz): + def test_dti_add_timedeltalike(self, tz, delta): rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz) result = rng + delta expected = pd.date_range('2000-01-01 02:00', From 79bf017e6000666ad5c56158a5d6dd815f829e92 Mon Sep 17 00:00:00 2001 From: Brock Mendel Date: Mon, 6 Nov 2017 09:45:53 -0800 Subject: [PATCH 09/12] fix parametrization screwup --- pandas/tests/indexes/datetimes/test_arithmetic.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pandas/tests/indexes/datetimes/test_arithmetic.py b/pandas/tests/indexes/datetimes/test_arithmetic.py index 40f0d88f9c391..cb608cfe0e8a1 100644 --- a/pandas/tests/indexes/datetimes/test_arithmetic.py +++ b/pandas/tests/indexes/datetimes/test_arithmetic.py @@ -57,7 +57,7 @@ def test_dti_iadd_int(self, tz): tm.assert_index_equal(rng, expected) @pytest.mark.parametrize('tz', tz) - def test_dti_sub_int(self): + def test_dti_sub_int(self, tz): rng = pd.date_range('2000-01-01 09:00', freq='H', periods=10, tz=tz) result = rng - 1 @@ -88,7 +88,7 @@ def test_dti_add_timedeltalike(self, tz, delta): @pytest.mark.parametrize('delta', two_hour_variants) @pytest.mark.parametrize('tz', tz) - def test_dti_iadd_timedeltalike(self, tz): + def test_dti_iadd_timedeltalike(self, tz, delta): rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz) expected = pd.date_range('2000-01-01 02:00', '2000-02-01 02:00', tz=tz) @@ -97,7 +97,7 @@ def test_dti_iadd_timedeltalike(self, tz): @pytest.mark.parametrize('delta', two_hour_variants) @pytest.mark.parametrize('tz', tz) - def test_dti_sub_timedeltalike(self, tz): + def test_dti_sub_timedeltalike(self, tz, delta): rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz) expected = pd.date_range('1999-12-31 22:00', '2000-01-31 22:00', tz=tz) @@ -106,7 +106,7 @@ def test_dti_sub_timedeltalike(self, tz): @pytest.mark.parametrize('delta', two_hour_variants) @pytest.mark.parametrize('tz', tz) - def test_dti_isub_timedeltalike(self, tz): + def test_dti_isub_timedeltalike(self, tz, delta): rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz) expected = pd.date_range('1999-12-31 22:00', '2000-01-31 22:00', tz=tz) From ec446235d728271e0ab788f94afca9125f33e465 Mon Sep 17 00:00:00 2001 From: Brock Mendel Date: Mon, 6 Nov 2017 12:07:22 -0800 Subject: [PATCH 10/12] whitespace fixup --- pandas/tests/indexes/datetimes/test_arithmetic.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pandas/tests/indexes/datetimes/test_arithmetic.py b/pandas/tests/indexes/datetimes/test_arithmetic.py index cb608cfe0e8a1..cfe29925f933f 100644 --- a/pandas/tests/indexes/datetimes/test_arithmetic.py +++ b/pandas/tests/indexes/datetimes/test_arithmetic.py @@ -14,7 +14,6 @@ date_range) - class TestDatetimeIndexArithmetic(object): tz = [None, 'UTC', 'Asia/Tokyo', 'US/Eastern', 'dateutil/Asia/Singapore', 'dateutil/US/Pacific'] From a2aef2a3803603a3a7290e9415ebe7e90d89f409 Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Thu, 9 Nov 2017 07:25:16 -0500 Subject: [PATCH 11/12] use fixtures --- .../indexes/datetimes/test_arithmetic.py | 55 +++++++++---------- .../indexes/timedeltas/test_arithmetic.py | 23 ++++---- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/pandas/tests/indexes/datetimes/test_arithmetic.py b/pandas/tests/indexes/datetimes/test_arithmetic.py index cfe29925f933f..2f788a116c0e5 100644 --- a/pandas/tests/indexes/datetimes/test_arithmetic.py +++ b/pandas/tests/indexes/datetimes/test_arithmetic.py @@ -14,13 +14,34 @@ date_range) -class TestDatetimeIndexArithmetic(object): - tz = [None, 'UTC', 'Asia/Tokyo', 'US/Eastern', 'dateutil/Asia/Singapore', - 'dateutil/US/Pacific'] +@pytest.fixture(params=[None, 'UTC', 'Asia/Tokyo', + 'US/Eastern', 'dateutil/Asia/Singapore', + 'dateutil/US/Pacific']) +def tz(request): + return request.param + +@pytest.fixture(params=[pd.offsets.Hour(2), timedelta(hours=2), + np.timedelta64(2, 'h'), Timedelta(hours=2)], + ids=str) +def delta(request): # Several ways of representing two hours - two_hour_variants = [pd.offsets.Hour(2), timedelta(hours=2), - np.timedelta64(2, 'h'), Timedelta(hours=2)] + return request.param + + +@pytest.fixture( + params=[ + datetime(2011, 1, 1), + DatetimeIndex(['2011-01-01', '2011-01-02']), + DatetimeIndex(['2011-01-01', '2011-01-02']).tz_localize('US/Eastern'), + np.datetime64('2011-01-01'), + Timestamp('2011-01-01')], + ids=lambda x: type(x).__name__) +def addend(request): + return request.param + + +class TestDatetimeIndexArithmetic(object): def test_dti_add_timestamp_raises(self): idx = DatetimeIndex(['2011-01-01', '2011-01-02']) @@ -37,7 +58,6 @@ def test_dti_radd_timestamp_raises(self): # ------------------------------------------------------------- # Binary operations DatetimeIndex and int - @pytest.mark.parametrize('tz', tz) def test_dti_add_int(self, tz): rng = pd.date_range('2000-01-01 09:00', freq='H', periods=10, tz=tz) @@ -46,7 +66,6 @@ def test_dti_add_int(self, tz): periods=10, tz=tz) tm.assert_index_equal(result, expected) - @pytest.mark.parametrize('tz', tz) def test_dti_iadd_int(self, tz): rng = pd.date_range('2000-01-01 09:00', freq='H', periods=10, tz=tz) @@ -55,7 +74,6 @@ def test_dti_iadd_int(self, tz): rng += 1 tm.assert_index_equal(rng, expected) - @pytest.mark.parametrize('tz', tz) def test_dti_sub_int(self, tz): rng = pd.date_range('2000-01-01 09:00', freq='H', periods=10, tz=tz) @@ -64,7 +82,6 @@ def test_dti_sub_int(self, tz): periods=10, tz=tz) tm.assert_index_equal(result, expected) - @pytest.mark.parametrize('tz', tz) def test_dti_isub_int(self, tz): rng = pd.date_range('2000-01-01 09:00', freq='H', periods=10, tz=tz) @@ -76,8 +93,6 @@ def test_dti_isub_int(self, tz): # ------------------------------------------------------------- # Binary operations DatetimeIndex and timedelta-like - @pytest.mark.parametrize('delta', two_hour_variants) - @pytest.mark.parametrize('tz', tz) def test_dti_add_timedeltalike(self, tz, delta): rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz) result = rng + delta @@ -85,8 +100,6 @@ def test_dti_add_timedeltalike(self, tz, delta): '2000-02-01 02:00', tz=tz) tm.assert_index_equal(result, expected) - @pytest.mark.parametrize('delta', two_hour_variants) - @pytest.mark.parametrize('tz', tz) def test_dti_iadd_timedeltalike(self, tz, delta): rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz) expected = pd.date_range('2000-01-01 02:00', @@ -94,8 +107,6 @@ def test_dti_iadd_timedeltalike(self, tz, delta): rng += delta tm.assert_index_equal(rng, expected) - @pytest.mark.parametrize('delta', two_hour_variants) - @pytest.mark.parametrize('tz', tz) def test_dti_sub_timedeltalike(self, tz, delta): rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz) expected = pd.date_range('1999-12-31 22:00', @@ -103,8 +114,6 @@ def test_dti_sub_timedeltalike(self, tz, delta): result = rng - delta tm.assert_index_equal(result, expected) - @pytest.mark.parametrize('delta', two_hour_variants) - @pytest.mark.parametrize('tz', tz) def test_dti_isub_timedeltalike(self, tz, delta): rng = pd.date_range('2000-01-01', '2000-02-01', tz=tz) expected = pd.date_range('1999-12-31 22:00', @@ -117,12 +126,6 @@ def test_dti_isub_timedeltalike(self, tz, delta): # TODO: A couple other tests belong in this section. Move them in # A PR where there isn't already a giant diff. - @pytest.mark.parametrize('addend', [ - datetime(2011, 1, 1), - DatetimeIndex(['2011-01-01', '2011-01-02']), - DatetimeIndex(['2011-01-01', '2011-01-02']).tz_localize('US/Eastern'), - np.datetime64('2011-01-01'), - Timestamp('2011-01-01')]) def test_add_datetimelike_and_dti(self, addend): # GH#9631 dti = DatetimeIndex(['2011-01-01', '2011-01-02']) @@ -133,12 +136,6 @@ def test_add_datetimelike_and_dti(self, addend): with tm.assert_raises_regex(TypeError, msg): addend + dti - @pytest.mark.parametrize('addend', [ - datetime(2011, 1, 1), - DatetimeIndex(['2011-01-01', '2011-01-02']), - DatetimeIndex(['2011-01-01', '2011-01-02']).tz_localize('US/Eastern'), - np.datetime64('2011-01-01'), - Timestamp('2011-01-01')]) def test_add_datetimelike_and_dti_tz(self, addend): # GH#9631 dti_tz = DatetimeIndex(['2011-01-01', diff --git a/pandas/tests/indexes/timedeltas/test_arithmetic.py b/pandas/tests/indexes/timedeltas/test_arithmetic.py index be4859c4c7241..0b60ca6e8a720 100644 --- a/pandas/tests/indexes/timedeltas/test_arithmetic.py +++ b/pandas/tests/indexes/timedeltas/test_arithmetic.py @@ -12,13 +12,21 @@ Timestamp, Timedelta) +@pytest.fixture(params=[pd.offsets.Hour(2), timedelta(hours=2), + np.timedelta64(2, 'h'), Timedelta(hours=2)], + ids=str) +def delta(request): + # Several ways of representing two hours + return request.param + + +@pytest.fixture(params=['B', 'D']) +def freq(request): + return request.param + + class TestTimedeltaIndexArithmetic(object): _holder = TimedeltaIndex - _multiprocess_can_split_ = True - - # Several ways of representing two hours - two_hour_variants = [pd.offsets.Hour(2), timedelta(hours=2), - np.timedelta64(2, 'h'), Timedelta(hours=2)] # TODO: Split by ops, better name def test_numeric_compat(self): @@ -122,7 +130,6 @@ def test_tdi_isub_int(self): # ------------------------------------------------------------- # Binary operations TimedeltaIndex and timedelta-like - @pytest.mark.parametrize('delta', two_hour_variants) def test_tdi_add_timedeltalike(self, delta): # only test adding/sub offsets as + is now numeric rng = timedelta_range('1 days', '10 days') @@ -131,7 +138,6 @@ def test_tdi_add_timedeltalike(self, delta): freq='D') tm.assert_index_equal(result, expected) - @pytest.mark.parametrize('delta', two_hour_variants) def test_tdi_iadd_timedeltalike(self, delta): # only test adding/sub offsets as + is now numeric rng = timedelta_range('1 days', '10 days') @@ -140,7 +146,6 @@ def test_tdi_iadd_timedeltalike(self, delta): rng += delta tm.assert_index_equal(rng, expected) - @pytest.mark.parametrize('delta', two_hour_variants) def test_tdi_sub_timedeltalike(self, delta): # only test adding/sub offsets as - is now numeric rng = timedelta_range('1 days', '10 days') @@ -148,7 +153,6 @@ def test_tdi_sub_timedeltalike(self, delta): expected = timedelta_range('0 days 22:00:00', '9 days 22:00:00') tm.assert_index_equal(result, expected) - @pytest.mark.parametrize('delta', two_hour_variants) def test_tdi_isub_timedeltalike(self, delta): # only test adding/sub offsets as - is now numeric rng = timedelta_range('1 days', '10 days') @@ -671,7 +675,6 @@ def test_tdi_ops_attributes(self): # TODO: Needs more informative name, probably split up into # more targeted tests - @pytest.mark.parametrize('freq', ['B', 'D']) def test_timedelta(self, freq): index = date_range('1/1/2000', periods=50, freq=freq) From 8e4bfa53546d7cf133c43cd3fd72c1388c4f9a7c Mon Sep 17 00:00:00 2001 From: Brock Mendel Date: Thu, 9 Nov 2017 09:24:56 -0800 Subject: [PATCH 12/12] dummy commit to force CI --- pandas/tests/test_downstream.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pandas/tests/test_downstream.py b/pandas/tests/test_downstream.py index 61f0c992225c6..56bc29a7bca1e 100644 --- a/pandas/tests/test_downstream.py +++ b/pandas/tests/test_downstream.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """ Testing that we work in the downstream packages """