Skip to content

Commit fa1e22e

Browse files
jbrockmendelPingviinituutti
authored andcommitted
TST: implement tm.to_array, box_with_timedelta, box4 (pandas-dev#23748)
1 parent 142ef14 commit fa1e22e

File tree

2 files changed

+71
-10
lines changed

2 files changed

+71
-10
lines changed

pandas/tests/arithmetic/conftest.py

+41-6
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,25 @@
55
import pandas as pd
66

77
from pandas.compat import long
8-
from pandas.core.arrays import PeriodArray, DatetimeArrayMixin as DatetimeArray
8+
from pandas.core.arrays import (
9+
PeriodArray, DatetimeArrayMixin as DatetimeArray,
10+
TimedeltaArrayMixin as TimedeltaArray)
11+
import pandas.util.testing as tm
912

1013

14+
# ------------------------------------------------------------------
15+
# Helper Functions
16+
17+
def id_func(x):
18+
if isinstance(x, tuple):
19+
assert len(x) == 2
20+
return x[0].__name__ + '-' + str(x[1])
21+
else:
22+
return x.__name__
23+
24+
25+
# ------------------------------------------------------------------
26+
1127
@pytest.fixture(params=[1, np.array(1, dtype=np.int64)])
1228
def one(request):
1329
# zero-dim integer array behaves like an integer
@@ -137,7 +153,7 @@ def mismatched_freq(request):
137153
# ------------------------------------------------------------------
138154

139155
@pytest.fixture(params=[pd.Index, pd.Series, pd.DataFrame],
140-
ids=lambda x: x.__name__)
156+
ids=id_func)
141157
def box(request):
142158
"""
143159
Several array-like containers that should have effectively identical
@@ -150,7 +166,7 @@ def box(request):
150166
pd.Series,
151167
pytest.param(pd.DataFrame,
152168
marks=pytest.mark.xfail(strict=True))],
153-
ids=lambda x: x.__name__)
169+
ids=id_func)
154170
def box_df_fail(request):
155171
"""
156172
Fixture equivalent to `box` fixture but xfailing the DataFrame case.
@@ -163,7 +179,7 @@ def box_df_fail(request):
163179
(pd.DataFrame, False),
164180
pytest.param((pd.DataFrame, True),
165181
marks=pytest.mark.xfail(strict=True))],
166-
ids=lambda x: x[0].__name__ + '-' + str(x[1]))
182+
ids=id_func)
167183
def box_transpose_fail(request):
168184
"""
169185
Fixture similar to `box` but testing both transpose cases for DataFrame,
@@ -174,7 +190,7 @@ def box_transpose_fail(request):
174190

175191

176192
@pytest.fixture(params=[pd.Index, pd.Series, pd.DataFrame, PeriodArray],
177-
ids=lambda x: x.__name__)
193+
ids=id_func)
178194
def box_with_period(request):
179195
"""
180196
Like `box`, but specific to PeriodDtype for also testing PeriodArray
@@ -183,9 +199,28 @@ def box_with_period(request):
183199

184200

185201
@pytest.fixture(params=[pd.Index, pd.Series, pd.DataFrame, DatetimeArray],
186-
ids=lambda x: x.__name__)
202+
ids=id_func)
187203
def box_with_datetime(request):
188204
"""
189205
Like `box`, but specific to datetime64 for also testing DatetimeArray
190206
"""
191207
return request.param
208+
209+
210+
@pytest.fixture(params=[pd.Index, pd.Series, pd.DataFrame, TimedeltaArray],
211+
ids=id_func)
212+
def box_with_timedelta(request):
213+
"""
214+
Like `box`, but specific to timedelta64 for also testing TimedeltaArray
215+
"""
216+
return request.param
217+
218+
219+
@pytest.fixture(params=[pd.Index, pd.Series, pd.DataFrame, tm.to_array],
220+
ids=id_func)
221+
def box_with_array(request):
222+
"""
223+
Fixture to test behavior for Index, Series, DataFrame, and pandas Array
224+
classes
225+
"""
226+
return request.param

pandas/util/testing.py

+30-4
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@
2424
map, raise_with_traceback, range, string_types, u, unichr, zip)
2525

2626
from pandas.core.dtypes.common import (
27-
is_bool, is_categorical_dtype, is_datetimelike_v_numeric,
28-
is_datetimelike_v_object, is_extension_array_dtype, is_interval_dtype,
29-
is_list_like, is_number, is_sequence, needs_i8_conversion)
27+
is_bool, is_categorical_dtype, is_datetime64_dtype, is_datetime64tz_dtype,
28+
is_datetimelike_v_numeric, is_datetimelike_v_object,
29+
is_extension_array_dtype, is_interval_dtype, is_list_like, is_number,
30+
is_period_dtype, is_sequence, is_timedelta64_dtype, needs_i8_conversion)
3031
from pandas.core.dtypes.missing import array_equivalent
3132

3233
import pandas as pd
@@ -37,7 +38,7 @@
3738
from pandas.core.algorithms import take_1d
3839
from pandas.core.arrays import (
3940
DatetimeArrayMixin as DatetimeArray, ExtensionArray, IntervalArray,
40-
PeriodArray, period_array)
41+
PeriodArray, TimedeltaArrayMixin as TimedeltaArray, period_array)
4142
import pandas.core.common as com
4243

4344
from pandas.io.common import urlopen
@@ -1080,6 +1081,13 @@ def assert_datetime_array_equal(left, right, obj='DatetimeArray'):
10801081
assert_attr_equal('tz', left, right, obj=obj)
10811082

10821083

1084+
def assert_timedelta_array_equal(left, right, obj='TimedeltaArray'):
1085+
_check_isinstance(left, right, TimedeltaArray)
1086+
assert_numpy_array_equal(left._data, right._data,
1087+
obj='{obj}._data'.format(obj=obj))
1088+
assert_attr_equal('freq', left, right, obj=obj)
1089+
1090+
10831091
def raise_assert_detail(obj, message, left, right, diff=None):
10841092
__tracebackhide__ = True
10851093

@@ -1579,6 +1587,8 @@ def assert_equal(left, right, **kwargs):
15791587
assert_period_array_equal(left, right, **kwargs)
15801588
elif isinstance(left, DatetimeArray):
15811589
assert_datetime_array_equal(left, right, **kwargs)
1590+
elif isinstance(left, TimedeltaArray):
1591+
assert_timedelta_array_equal(left, right, **kwargs)
15821592
elif isinstance(left, ExtensionArray):
15831593
assert_extension_array_equal(left, right, **kwargs)
15841594
elif isinstance(left, np.ndarray):
@@ -1616,13 +1626,29 @@ def box_expected(expected, box_cls, transpose=True):
16161626
expected = period_array(expected)
16171627
elif box_cls is DatetimeArray:
16181628
expected = DatetimeArray(expected)
1629+
elif box_cls is TimedeltaArray:
1630+
expected = TimedeltaArray(expected)
16191631
elif box_cls is np.ndarray:
16201632
expected = np.array(expected)
1633+
elif box_cls is to_array:
1634+
expected = to_array(expected)
16211635
else:
16221636
raise NotImplementedError(box_cls)
16231637
return expected
16241638

16251639

1640+
def to_array(obj):
1641+
# temporary implementation until we get pd.array in place
1642+
if is_period_dtype(obj):
1643+
return period_array(obj)
1644+
elif is_datetime64_dtype(obj) or is_datetime64tz_dtype(obj):
1645+
return DatetimeArray(obj)
1646+
elif is_timedelta64_dtype(obj):
1647+
return TimedeltaArray(obj)
1648+
else:
1649+
return np.array(obj)
1650+
1651+
16261652
# -----------------------------------------------------------------------------
16271653
# Sparse
16281654

0 commit comments

Comments
 (0)