From 68537e354c0f44197c90535dfc076459e8bfa772 Mon Sep 17 00:00:00 2001 From: Terji Petersen Date: Sun, 11 Dec 2022 18:02:14 +0000 Subject: [PATCH] API: ensure IntervalIndex.left/right are 64bit if numeric (#50130) --- pandas/core/indexes/interval.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/pandas/core/indexes/interval.py b/pandas/core/indexes/interval.py index ae2d054fe94fe..997bf7c9a7fb1 100644 --- a/pandas/core/indexes/interval.py +++ b/pandas/core/indexes/interval.py @@ -59,6 +59,8 @@ is_number, is_object_dtype, is_scalar, + is_signed_integer_dtype, + is_unsigned_integer_dtype, ) from pandas.core.dtypes.dtypes import IntervalDtype from pandas.core.dtypes.missing import is_valid_na_for_dtype @@ -521,6 +523,7 @@ def _maybe_convert_i8(self, key): original = key if is_list_like(key): key = ensure_index(key) + key = self._maybe_convert_numeric_to_64bit(key) if not self._needs_i8_conversion(key): return original @@ -566,6 +569,20 @@ def _maybe_convert_i8(self, key): return key_i8 + def _maybe_convert_numeric_to_64bit(self, idx: Index) -> Index: + # IntervalTree only supports 64 bit numpy array + dtype = idx.dtype + if np.issubclass_(dtype.type, np.number): + return idx + elif is_signed_integer_dtype(dtype) and dtype != np.int64: + return idx.astype(np.int64) + elif is_unsigned_integer_dtype(dtype) and dtype != np.uint64: + return idx.astype(np.uint64) + elif is_float_dtype(dtype) and dtype != np.float64: + return idx.astype(np.float64) + else: + return idx + def _searchsorted_monotonic(self, label, side: Literal["left", "right"] = "left"): if not self.is_non_overlapping_monotonic: raise KeyError(