Skip to content

~Finish collecting m8[ns] tests, start collecting division by zero tests #22153

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 13 commits into from
Aug 7, 2018
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
port add/sub tests, cleanup imports
  • Loading branch information
jbrockmendel committed Aug 1, 2018
commit 4ebd99c46398135e624d36381ef8bd2bc4c89f23
18 changes: 2 additions & 16 deletions pandas/tests/indexes/timedeltas/test_arithmetic.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

import pandas as pd
import pandas.util.testing as tm
from pandas import (DatetimeIndex, TimedeltaIndex, Float64Index, Int64Index,
from pandas import (DatetimeIndex, TimedeltaIndex, Int64Index,
to_timedelta, timedelta_range, date_range,
Series,
Timestamp, Timedelta)
Expand Down Expand Up @@ -405,14 +405,7 @@ def test_tdi_addsub_integer_array_no_freq(self, box):

# -------------------------------------------------------------
# Binary operations TimedeltaIndex and timedelta-like

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)
# Note: add and sub are tested in tests.test_arithmetic

def test_tdi_iadd_timedeltalike(self, delta):
# only test adding/sub offsets as + is now numeric
Expand All @@ -422,13 +415,6 @@ def test_tdi_iadd_timedeltalike(self, delta):
rng += delta
tm.assert_index_equal(rng, expected)

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)

def test_tdi_isub_timedeltalike(self, delta):
# only test adding/sub offsets as - is now numeric
rng = timedelta_range('1 days', '10 days')
Expand Down
125 changes: 75 additions & 50 deletions pandas/tests/test_arithmetic.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from pandas.errors import NullFrequencyError
from pandas._libs.tslibs import IncompatibleFrequency
from pandas import (
timedelta_range,
Timedelta, Timestamp, NaT, Series, TimedeltaIndex, DatetimeIndex)


Expand All @@ -30,7 +31,7 @@ def tdser():

@pytest.fixture(params=[pd.offsets.Hour(2), timedelta(hours=2),
np.timedelta64(2, 'h'), Timedelta(hours=2)],
ids=str)
ids=lambda x: type(x).__name__)
def delta(request):
"""
Several ways of representing two hours
Expand Down Expand Up @@ -59,12 +60,11 @@ def box(request):
return request.param


@pytest.fixture(params=[
pd.Index,
Series,
pytest.param(pd.DataFrame,
marks=pytest.mark.xfail(strict=True))]
ids=lambda x: x.__name__)
@pytest.fixture(params=[pd.Index,
Series,
pytest.param(pd.DataFrame,
marks=pytest.mark.xfail(strict=True))],
ids=lambda x: x.__name__)
def box_df_fail(request):
"""
Fixture equivalent to `box` fixture but xfailing the DataFrame case.
Expand Down Expand Up @@ -102,7 +102,7 @@ def test_numeric_arr_mul_tdscalar(self, scalar_td, index, box):
type(scalar_td) is timedelta and index.dtype == 'f8'):
raise pytest.xfail(reason="Cannot multiply timedelta by float")

expected = pd.timedelta_range('1 days', '10 days')
expected = timedelta_range('1 days', '10 days')

index = tm.box_expected(index, box)
expected = tm.box_expected(expected, box)
Expand Down Expand Up @@ -268,6 +268,39 @@ def test_td64_radd_timestamp(self, box):
result = Timestamp('2011-01-01') + idx
tm.assert_equal(result, expected)

@pytest.mark.parametrize('box', [
pd.Index,
Series,
pytest.param(pd.DataFrame,
marks=pytest.mark.xfail(reason="Returns object dtype "
"instead of "
"datetime64[ns]",
strict=True))
], ids=lambda x: x.__name__)
def test_td64arr_add_sub_timestamp(self, box):
# GH#11925
ts = Timestamp('2012-01-01')
# TODO: parametrize over types of datetime scalar?

tdser = Series(timedelta_range('1 day', periods=3))
expected = Series(pd.date_range('2012-01-02', periods=3))

tdser = tm.box_expected(tdser, box)
expected = tm.box_expected(expected, box)

tm.assert_equal(ts + tdser, expected)
tm.assert_equal(tdser + ts, expected)

expected2 = Series(pd.date_range('2011-12-31',
periods=3, freq='-1D'))
expected2 = tm.box_expected(expected2, box)

tm.assert_equal(ts - tdser, expected2)
tm.assert_equal(ts + (-tdser), expected2)

with pytest.raises(TypeError):
tdser - ts

# ------------------------------------------------------------------
# Operations with int-like others

Expand Down Expand Up @@ -419,42 +452,6 @@ def test_td64arr_add_sub_numeric_arr_invalid(self, box, vec, dtype, tdser):
with pytest.raises(err):
vector - tdser

# ------------------------------------------------------------------
# Operations with datetime-like others

@pytest.mark.parametrize('box', [
pd.Index,
Series,
pytest.param(pd.DataFrame,
marks=pytest.mark.xfail(reason="Returns object dtype "
"instead of "
"datetime64[ns]",
strict=True))
], ids=lambda x: x.__name__)
def test_td64arr_add_sub_timestamp(self, box):
# GH#11925
ts = Timestamp('2012-01-01')
# TODO: parametrize over types of datetime scalar?

tdser = Series(pd.timedelta_range('1 day', periods=3))
expected = Series(pd.date_range('2012-01-02', periods=3))

tdser = tm.box_expected(tdser, box)
expected = tm.box_expected(expected, box)

tm.assert_equal(ts + tdser, expected)
tm.assert_equal(tdser + ts, expected)

expected2 = Series(pd.date_range('2011-12-31',
periods=3, freq='-1D'))
expected2 = tm.box_expected(expected2, box)

tm.assert_equal(ts - tdser, expected2)
tm.assert_equal(ts + (-tdser), expected2)

with pytest.raises(TypeError):
tdser - ts

# ------------------------------------------------------------------
# Operations with timedelta-like others (including DateOffsets)

Expand Down Expand Up @@ -522,9 +519,37 @@ def test_td64arr_sub_NaT(self, box):
ser = tm.box_expected(ser, box)
expected = tm.box_expected(expected, box)

res = ser - NaT
res = ser - pd.NaT
tm.assert_equal(res, expected)

def test_td64arr_add_timedeltalike(self, delta, box):
# only test adding/sub offsets as + is now numeric
if box is pd.DataFrame and isinstance(delta, pd.DateOffset):
pytest.xfail(reason="Returns object dtype instead of m8[ns]")

rng = timedelta_range('1 days', '10 days')
expected = timedelta_range('1 days 02:00:00', '10 days 02:00:00',
freq='D')
rng = tm.box_expected(rng, box)
expected = tm.box_expected(expected, box)

result = rng + delta
tm.assert_equal(result, expected)

def test_td64arr_sub_timedeltalike(self, delta, box):
# only test adding/sub offsets as - is now numeric
if box is pd.DataFrame and isinstance(delta, pd.DateOffset):
pytest.xfail(reason="Returns object dtype instead of m8[ns]")

rng = timedelta_range('1 days', '10 days')
expected = timedelta_range('0 days 22:00:00', '9 days 22:00:00')

rng = tm.box_expected(rng, box)
expected = tm.box_expected(expected, box)

result = rng - delta
tm.assert_equal(result, expected)


class TestTimedeltaArraylikeMulDivOps(object):
# Tests for timedelta64[ns]
Expand All @@ -549,7 +574,7 @@ def test_td64arr_mul_tdlike_scalar_raises(self, delta, box):
if box is pd.DataFrame and not isinstance(delta, pd.DateOffset):
pytest.xfail(reason="returns m8[ns] instead of raising")

rng = pd.timedelta_range('1 days', '10 days', name='foo')
rng = timedelta_range('1 days', '10 days', name='foo')
rng = tm.box_expected(rng, box)
with pytest.raises(TypeError):
rng * delta
Expand Down Expand Up @@ -618,7 +643,7 @@ def test_tdi_rmul_arraylike(self, other, box_df_fail):
box = box_df_fail

tdi = TimedeltaIndex(['1 Day'] * 10)
expected = pd.timedelta_range('1 days', '10 days')
expected = timedelta_range('1 days', '10 days')

tdi = tm.box_expected(tdi, box)
expected = tm.box_expected(expected, box)
Expand All @@ -634,7 +659,7 @@ def test_tdi_rmul_arraylike(self, other, box_df_fail):
def test_td64arr_div_nat_invalid(self, box_df_fail):
# don't allow division by NaT (maybe could in the future)
box = box_df_fail # DataFrame returns all-NaT instead of raising
rng = pd.timedelta_range('1 days', '10 days', name='foo')
rng = timedelta_range('1 days', '10 days', name='foo')
rng = tm.box_expected(rng, box)
with pytest.raises(TypeError):
rng / pd.NaT
Expand All @@ -649,7 +674,7 @@ def test_td64arr_div_int(self, box_df_fail):

def test_tdi_div_tdlike_scalar(self, delta, box_df_fail):
box = box_df_fail # DataFrame op returns m8[ns] instead of float64
rng = pd.timedelta_range('1 days', '10 days', name='foo')
rng = timedelta_range('1 days', '10 days', name='foo')
expected = pd.Float64Index((np.arange(10) + 1) * 12, name='foo')

rng = tm.box_expected(rng, box)
Expand Down Expand Up @@ -745,7 +770,7 @@ def test_td64arr_floordiv_int(self, box_df_fail):

def test_td64arr_floordiv_tdlike_scalar(self, delta, box_df_fail):
box = box_df_fail # DataFrame returns m8[ns] instead of int64 dtype
tdi = pd.timedelta_range('1 days', '10 days', name='foo')
tdi = timedelta_range('1 days', '10 days', name='foo')
expected = pd.Int64Index((np.arange(10) + 1) * 12, name='foo')

tdi = tm.box_expected(tdi, box)
Expand Down