From 1a1fb7f9479510913a318efb8f1261eee3b9b9be Mon Sep 17 00:00:00 2001 From: Brock Date: Sun, 22 Nov 2020 12:35:49 -0800 Subject: [PATCH 1/3] REF: define DTA._infer_matches --- pandas/core/arrays/datetimelike.py | 1 + pandas/core/arrays/datetimes.py | 1 + pandas/core/arrays/period.py | 1 + pandas/core/arrays/timedeltas.py | 1 + pandas/core/indexes/datetimelike.py | 23 +++++------------------ pandas/core/indexes/datetimes.py | 3 --- pandas/core/indexes/timedeltas.py | 3 --- 7 files changed, 9 insertions(+), 24 deletions(-) diff --git a/pandas/core/arrays/datetimelike.py b/pandas/core/arrays/datetimelike.py index 3b419f8d1da2a..6d7cc460ba3ae 100644 --- a/pandas/core/arrays/datetimelike.py +++ b/pandas/core/arrays/datetimelike.py @@ -101,6 +101,7 @@ class DatetimeLikeArrayMixin(OpsMixin, NDArrayBackedExtensionArray): _generate_range """ + _infer_matches: Tuple[str] _is_recognized_dtype: Callable[[DtypeObj], bool] _recognized_scalars: Tuple[Type, ...] _data: np.ndarray diff --git a/pandas/core/arrays/datetimes.py b/pandas/core/arrays/datetimes.py index 7c6b38d9114ab..ce70f929cc79d 100644 --- a/pandas/core/arrays/datetimes.py +++ b/pandas/core/arrays/datetimes.py @@ -154,6 +154,7 @@ class DatetimeArray(dtl.TimelikeOps, dtl.DatelikeOps): _scalar_type = Timestamp _recognized_scalars = (datetime, np.datetime64) _is_recognized_dtype = is_datetime64_any_dtype + _infer_matches = ("datetime", "datetime64", "date") # define my properties & methods for delegation _bool_ops = [ diff --git a/pandas/core/arrays/period.py b/pandas/core/arrays/period.py index 80882acceb56a..50ed526cf01e9 100644 --- a/pandas/core/arrays/period.py +++ b/pandas/core/arrays/period.py @@ -124,6 +124,7 @@ class PeriodArray(PeriodMixin, dtl.DatelikeOps): _scalar_type = Period _recognized_scalars = (Period,) _is_recognized_dtype = is_period_dtype + _infer_matches = ("period",) # Names others delegate to us _other_ops: List[str] = [] diff --git a/pandas/core/arrays/timedeltas.py b/pandas/core/arrays/timedeltas.py index 035e6e84c6ec8..998117cc49d50 100644 --- a/pandas/core/arrays/timedeltas.py +++ b/pandas/core/arrays/timedeltas.py @@ -104,6 +104,7 @@ class TimedeltaArray(dtl.TimelikeOps): _scalar_type = Timedelta _recognized_scalars = (timedelta, np.timedelta64, Tick) _is_recognized_dtype = is_timedelta64_dtype + _infer_matches = ("timedelta", "timedelta64") __array_priority__ = 1000 # define my properties & methods for delegation diff --git a/pandas/core/indexes/datetimelike.py b/pandas/core/indexes/datetimelike.py index c30abb144cea5..88967ba7f396d 100644 --- a/pandas/core/indexes/datetimelike.py +++ b/pandas/core/indexes/datetimelike.py @@ -159,16 +159,8 @@ def equals(self, other: object) -> bool: elif other.dtype.kind in ["f", "i", "u", "c"]: return False elif not isinstance(other, type(self)): - inferrable = [ - "timedelta", - "timedelta64", - "datetime", - "datetime64", - "date", - "period", - ] - should_try = False + inferrable = self._data._infer_matches if other.dtype == object: should_try = other.inferred_type in inferrable elif is_categorical_dtype(other.dtype): @@ -529,17 +521,9 @@ def isin(self, values, level=None): return np.zeros(self.shape, dtype=bool) if not isinstance(values, type(self)): - inferrable = [ - "timedelta", - "timedelta64", - "datetime", - "datetime64", - "date", - "period", - ] if values.dtype == object: inferred = lib.infer_dtype(values, skipna=False) - if inferred not in inferrable: + if inferred not in self._data._infer_matches: if "mixed" in inferred: return self.astype(object).isin(values) return np.zeros(self.shape, dtype=bool) @@ -706,6 +690,9 @@ def _has_complex_internals(self) -> bool: # used to avoid libreduction code paths, which raise or require conversion return False + def is_type_compatible(self, kind: str) -> bool: + return kind in self._data._infer_matches + # -------------------------------------------------------------------- # Set Operation Methods diff --git a/pandas/core/indexes/datetimes.py b/pandas/core/indexes/datetimes.py index 1dd3eb1017eca..b39a36d95d27b 100644 --- a/pandas/core/indexes/datetimes.py +++ b/pandas/core/indexes/datetimes.py @@ -814,9 +814,6 @@ def slice_indexer(self, start=None, end=None, step=None, kind=None): # -------------------------------------------------------------------- - def is_type_compatible(self, kind: str) -> bool: - return kind == self.inferred_type or kind == "datetime" - @property def inferred_type(self) -> str: # b/c datetime is represented as microseconds since the epoch, make diff --git a/pandas/core/indexes/timedeltas.py b/pandas/core/indexes/timedeltas.py index 27e090f450cd8..f44a1701bfa9b 100644 --- a/pandas/core/indexes/timedeltas.py +++ b/pandas/core/indexes/timedeltas.py @@ -229,9 +229,6 @@ def _maybe_cast_slice_bound(self, label, side: str, kind): # ------------------------------------------------------------------- - def is_type_compatible(self, kind: str) -> bool: - return kind == self.inferred_type or kind == "timedelta" - @property def inferred_type(self) -> str: return "timedelta64" From a8661b8968c8d1f5370f5461cba7db8080027f69 Mon Sep 17 00:00:00 2001 From: Brock Date: Sun, 22 Nov 2020 13:41:58 -0800 Subject: [PATCH 2/3] mypy fixup --- pandas/core/arrays/datetimelike.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/arrays/datetimelike.py b/pandas/core/arrays/datetimelike.py index 6d7cc460ba3ae..fdec9a3499326 100644 --- a/pandas/core/arrays/datetimelike.py +++ b/pandas/core/arrays/datetimelike.py @@ -101,7 +101,7 @@ class DatetimeLikeArrayMixin(OpsMixin, NDArrayBackedExtensionArray): _generate_range """ - _infer_matches: Tuple[str] + _infer_matches: Tuple[str, ...] _is_recognized_dtype: Callable[[DtypeObj], bool] _recognized_scalars: Tuple[Type, ...] _data: np.ndarray From 2ef2f6493c37dbb82864fff4abb3a5816df4c809 Mon Sep 17 00:00:00 2001 From: Brock Date: Mon, 23 Nov 2020 19:05:04 -0800 Subject: [PATCH 3/3] comment --- pandas/core/arrays/datetimelike.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pandas/core/arrays/datetimelike.py b/pandas/core/arrays/datetimelike.py index 1e1446c3fff40..8fa2c734092f4 100644 --- a/pandas/core/arrays/datetimelike.py +++ b/pandas/core/arrays/datetimelike.py @@ -101,6 +101,7 @@ class DatetimeLikeArrayMixin(OpsMixin, NDArrayBackedExtensionArray): _generate_range """ + # _infer_matches -> which infer_dtype strings are close enough to our own _infer_matches: Tuple[str, ...] _is_recognized_dtype: Callable[[DtypeObj], bool] _recognized_scalars: Tuple[Type, ...]