Skip to content

Commit 1a28d55

Browse files
jbrockmendelJulianWgs
authored andcommitted
ENH: maybe_convert_objects handle IntervalArray (pandas-dev#41776)
1 parent f9b9bd7 commit 1a28d55

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed

pandas/_libs/lib.pyx

+24-1
Original file line numberDiff line numberDiff line change
@@ -1187,6 +1187,7 @@ cdef class Seen:
11871187
bint timedelta_ # seen_timedelta
11881188
bint datetimetz_ # seen_datetimetz
11891189
bint period_ # seen_period
1190+
bint interval_ # seen_interval
11901191

11911192
def __cinit__(self, bint coerce_numeric=False):
11921193
"""
@@ -1212,6 +1213,7 @@ cdef class Seen:
12121213
self.timedelta_ = False
12131214
self.datetimetz_ = False
12141215
self.period_ = False
1216+
self.interval_ = False
12151217
self.coerce_numeric = coerce_numeric
12161218

12171219
cdef inline bint check_uint64_conflict(self) except -1:
@@ -2035,7 +2037,6 @@ cpdef bint is_interval_array(ndarray values):
20352037
"""
20362038
Is this an ndarray of Interval (or np.nan) with a single dtype?
20372039
"""
2038-
20392040
cdef:
20402041
Py_ssize_t i, n = len(values)
20412042
str closed = None
@@ -2320,6 +2321,7 @@ def maybe_convert_objects(ndarray[object] objects,
23202321
bint convert_datetime=False,
23212322
bint convert_timedelta=False,
23222323
bint convert_period=False,
2324+
bint convert_interval=False,
23232325
bint convert_to_nullable_integer=False) -> "ArrayLike":
23242326
"""
23252327
Type inference function-- convert object array to proper dtype
@@ -2343,6 +2345,9 @@ def maybe_convert_objects(ndarray[object] objects,
23432345
convert_period : bool, default False
23442346
If an array-like object contains only (homogeneous-freq) Period values
23452347
or NaT, whether to convert and return a PeriodArray.
2348+
convert_interval : bool, default False
2349+
If an array-like object contains only Interval objects (with matching
2350+
dtypes and closedness) or NaN, whether to convert to IntervalArray.
23462351
convert_to_nullable_integer : bool, default False
23472352
If an array-like object contains only integer values (and NaN) is
23482353
encountered, whether to convert and return an IntegerArray.
@@ -2473,6 +2478,13 @@ def maybe_convert_objects(ndarray[object] objects,
24732478
except (ValueError, TypeError):
24742479
seen.object_ = True
24752480
break
2481+
elif is_interval(val):
2482+
if convert_interval:
2483+
seen.interval_ = True
2484+
break
2485+
else:
2486+
seen.object_ = True
2487+
break
24762488
else:
24772489
seen.object_ = True
24782490
break
@@ -2494,6 +2506,17 @@ def maybe_convert_objects(ndarray[object] objects,
24942506

24952507
# unbox to PeriodArray
24962508
return pi._data
2509+
seen.object_ = True
2510+
2511+
if seen.interval_:
2512+
if is_interval_array(objects):
2513+
from pandas import IntervalIndex
2514+
ii = IntervalIndex(objects)
2515+
2516+
# unbox to IntervalArray
2517+
return ii._data
2518+
2519+
seen.object_ = True
24972520

24982521
if not seen.object_:
24992522
result = None

pandas/tests/dtypes/test_inference.py

+16
Original file line numberDiff line numberDiff line change
@@ -813,6 +813,22 @@ def test_mixed_dtypes_remain_object_array(self):
813813
result = lib.maybe_convert_objects(arr, convert_datetime=True)
814814
tm.assert_numpy_array_equal(result, arr)
815815

816+
@pytest.mark.parametrize(
817+
"idx",
818+
[
819+
pd.IntervalIndex.from_breaks(range(5), closed="both"),
820+
pd.period_range("2016-01-01", periods=3, freq="D"),
821+
],
822+
)
823+
def test_maybe_convert_objects_ea(self, idx):
824+
825+
result = lib.maybe_convert_objects(
826+
np.array(idx, dtype=object),
827+
convert_period=True,
828+
convert_interval=True,
829+
)
830+
tm.assert_extension_array_equal(result, idx._data)
831+
816832

817833
class TestTypeInference:
818834

0 commit comments

Comments
 (0)