Skip to content

Commit 5c4ceae

Browse files
meeseeksmachinejreback
authored andcommitted
Backport PR #27653: BUG: Fix dir(interval_index) (#27693)
1 parent 9390b3e commit 5c4ceae

File tree

5 files changed

+25
-3
lines changed

5 files changed

+25
-3
lines changed

doc/source/whatsnew/v0.25.1.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ Strings
7878

7979
Interval
8080
^^^^^^^^
81-
81+
- Bug in :class:`IntervalIndex` where `dir(obj)` would raise ``ValueError`` (:issue:`27571`)
8282
-
8383
-
8484
-

pandas/_libs/lib.pyx

+1
Original file line numberDiff line numberDiff line change
@@ -969,6 +969,7 @@ _TYPE_MAP = {
969969
'M': 'datetime64',
970970
'timedelta64[ns]': 'timedelta64',
971971
'm': 'timedelta64',
972+
'interval': 'interval',
972973
}
973974

974975
# types only exist on certain platform

pandas/core/strings.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -1957,8 +1957,11 @@ def _validate(data):
19571957
values = getattr(data, "values", data) # Series / Index
19581958
values = getattr(values, "categories", values) # categorical / normal
19591959

1960-
# missing values obfuscate type inference -> skip
1961-
inferred_dtype = lib.infer_dtype(values, skipna=True)
1960+
try:
1961+
inferred_dtype = lib.infer_dtype(values, skipna=True)
1962+
except ValueError:
1963+
# GH#27571 mostly occurs with ExtensionArray
1964+
inferred_dtype = None
19621965

19631966
if inferred_dtype not in allowed_types:
19641967
raise AttributeError("Can only use .str accessor with string " "values!")

pandas/tests/dtypes/test_inference.py

+11
Original file line numberDiff line numberDiff line change
@@ -1134,6 +1134,17 @@ def test_categorical(self):
11341134
result = lib.infer_dtype(Series(arr), skipna=True)
11351135
assert result == "categorical"
11361136

1137+
def test_interval(self):
1138+
idx = pd.IntervalIndex.from_breaks(range(5), closed="both")
1139+
inferred = lib.infer_dtype(idx, skipna=False)
1140+
assert inferred == "interval"
1141+
1142+
inferred = lib.infer_dtype(idx._data, skipna=False)
1143+
assert inferred == "interval"
1144+
1145+
inferred = lib.infer_dtype(pd.Series(idx), skipna=False)
1146+
assert inferred == "interval"
1147+
11371148

11381149
class TestNumberScalar:
11391150
def test_is_number(self):

pandas/tests/indexes/interval/test_interval.py

+7
Original file line numberDiff line numberDiff line change
@@ -1095,3 +1095,10 @@ def test_is_all_dates(self):
10951095
)
10961096
year_2017_index = pd.IntervalIndex([year_2017])
10971097
assert not year_2017_index.is_all_dates
1098+
1099+
1100+
def test_dir():
1101+
# GH#27571 dir(interval_index) should not raise
1102+
index = IntervalIndex.from_arrays([0, 1], [1, 2])
1103+
result = dir(index)
1104+
assert "str" not in result

0 commit comments

Comments
 (0)