Skip to content

Commit 0fb9bbe

Browse files
committed
REF: Avoid inference in partial string indexing
1 parent 95ecf62 commit 0fb9bbe

File tree

4 files changed

+15
-4
lines changed

4 files changed

+15
-4
lines changed

pandas/core/indexes/base.py

+3
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,9 @@ def _outer_indexer(self, left, right):
243243
_infer_as_myclass = False
244244

245245
_engine_type = libindex.ObjectEngine
246+
# whether we support partial string indexing. Overridden
247+
# in DatetimeIndex and PeriodIndex
248+
_supports_partial_string_indexing = False
246249

247250
_accessors = {"str"}
248251

pandas/core/indexes/datetimes.py

+1
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@ def _join_i8_wrapper(joinf, **kwargs):
238238
)
239239

240240
_engine_type = libindex.DatetimeEngine
241+
_supports_partial_string_indexing = True
241242

242243
_tz = None
243244
_freq = None

pandas/core/indexes/period.py

+1
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ class PeriodIndex(DatetimeIndexOpsMixin, Int64Index, PeriodDelegateMixin):
173173
_data = None
174174

175175
_engine_type = libindex.PeriodEngine
176+
_supports_partial_string_indexing = True
176177

177178
# ------------------------------------------------------------------------
178179
# Index Constructors

pandas/core/indexing.py

+10-4
Original file line numberDiff line numberDiff line change
@@ -1704,7 +1704,7 @@ def _is_scalar_access(self, key: Tuple):
17041704
if isinstance(ax, MultiIndex):
17051705
return False
17061706

1707-
if isinstance(k, str) and ax.is_all_dates:
1707+
if isinstance(k, str) and ax._supports_partial_string_indexing:
17081708
# partial string indexing, df.loc['2000', 'A']
17091709
# should not be considered scalar
17101710
return False
@@ -1724,7 +1724,10 @@ def _get_partial_string_timestamp_match_key(self, key, labels):
17241724
"""Translate any partial string timestamp matches in key, returning the
17251725
new key (GH 10331)"""
17261726
if isinstance(labels, MultiIndex):
1727-
if isinstance(key, str) and labels.levels[0].is_all_dates:
1727+
if (
1728+
isinstance(key, str)
1729+
and labels.levels[0]._supports_partial_string_indexing
1730+
):
17281731
# Convert key '2016-01-01' to
17291732
# ('2016-01-01'[, slice(None, None, None)]+)
17301733
key = tuple([key] + [slice(None)] * (len(labels.levels) - 1))
@@ -1734,7 +1737,10 @@ def _get_partial_string_timestamp_match_key(self, key, labels):
17341737
# (..., slice('2016-01-01', '2016-01-01', None), ...)
17351738
new_key = []
17361739
for i, component in enumerate(key):
1737-
if isinstance(component, str) and labels.levels[i].is_all_dates:
1740+
if (
1741+
isinstance(component, str)
1742+
and labels.levels[i]._supports_partial_string_indexing
1743+
):
17381744
new_key.append(slice(component, component, None))
17391745
else:
17401746
new_key.append(component)
@@ -2339,7 +2345,7 @@ def convert_to_index_sliceable(obj, key):
23392345

23402346
# We might have a datetimelike string that we can translate to a
23412347
# slice here via partial string indexing
2342-
if idx.is_all_dates:
2348+
if idx._supports_partial_string_indexing:
23432349
try:
23442350
return idx._get_string_slice(key)
23452351
except (KeyError, ValueError, NotImplementedError):

0 commit comments

Comments
 (0)