Skip to content

Commit e6e9766

Browse files
authored
PERF: avoid com.is_datetime_or_timedelta_dtype (#52649)
1 parent bd5ed2f commit e6e9766

File tree

8 files changed

+14
-71
lines changed

8 files changed

+14
-71
lines changed

pandas/core/arrays/datetimelike.py

+1-5
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@
8484
from pandas.core.dtypes.common import (
8585
is_all_strings,
8686
is_datetime64_any_dtype,
87-
is_datetime_or_timedelta_dtype,
8887
is_dtype_equal,
8988
is_float_dtype,
9089
is_integer_dtype,
@@ -474,10 +473,7 @@ def astype(self, dtype, copy: bool = True):
474473
if copy:
475474
values = values.copy()
476475
return values
477-
elif (
478-
is_datetime_or_timedelta_dtype(dtype)
479-
and not is_dtype_equal(self.dtype, dtype)
480-
) or is_float_dtype(dtype):
476+
elif (dtype.kind in "mM" and self.dtype != dtype) or is_float_dtype(dtype):
481477
# disallow conversion between datetime/timedelta,
482478
# and conversions for any datetimelike to float
483479
msg = f"Cannot cast {type(self).__name__} to dtype {dtype}"

pandas/core/dtypes/common.py

-39
Original file line numberDiff line numberDiff line change
@@ -958,44 +958,6 @@ def is_timedelta64_ns_dtype(arr_or_dtype) -> bool:
958958
return _is_dtype(arr_or_dtype, lambda dtype: dtype == TD64NS_DTYPE)
959959

960960

961-
def is_datetime_or_timedelta_dtype(arr_or_dtype) -> bool:
962-
"""
963-
Check whether the provided array or dtype is of
964-
a timedelta64 or datetime64 dtype.
965-
966-
Parameters
967-
----------
968-
arr_or_dtype : array-like or dtype
969-
The array or dtype to check.
970-
971-
Returns
972-
-------
973-
boolean
974-
Whether or not the array or dtype is of a timedelta64,
975-
or datetime64 dtype.
976-
977-
Examples
978-
--------
979-
>>> is_datetime_or_timedelta_dtype(str)
980-
False
981-
>>> is_datetime_or_timedelta_dtype(int)
982-
False
983-
>>> is_datetime_or_timedelta_dtype(np.datetime64)
984-
True
985-
>>> is_datetime_or_timedelta_dtype(np.timedelta64)
986-
True
987-
>>> is_datetime_or_timedelta_dtype(np.array(['a', 'b']))
988-
False
989-
>>> is_datetime_or_timedelta_dtype(pd.Series([1, 2]))
990-
False
991-
>>> is_datetime_or_timedelta_dtype(np.array([], dtype=np.timedelta64))
992-
True
993-
>>> is_datetime_or_timedelta_dtype(np.array([], dtype=np.datetime64))
994-
True
995-
"""
996-
return _is_dtype_type(arr_or_dtype, classes(np.datetime64, np.timedelta64))
997-
998-
999961
# This exists to silence numpy deprecation warnings, see GH#29553
1000962
def is_numeric_v_string_like(a: ArrayLike, b) -> bool:
1001963
"""
@@ -1693,7 +1655,6 @@ def is_all_strings(value: ArrayLike) -> bool:
16931655
"is_datetime64_dtype",
16941656
"is_datetime64_ns_dtype",
16951657
"is_datetime64tz_dtype",
1696-
"is_datetime_or_timedelta_dtype",
16971658
"is_decimal",
16981659
"is_dict_like",
16991660
"is_dtype_equal",

pandas/core/indexes/interval.py

+9-5
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
)
4444
from pandas.core.dtypes.common import (
4545
ensure_platform_int,
46-
is_datetime_or_timedelta_dtype,
4746
is_dtype_equal,
4847
is_float,
4948
is_float_dtype,
@@ -53,6 +52,7 @@
5352
is_number,
5453
is_object_dtype,
5554
is_scalar,
55+
pandas_dtype,
5656
)
5757
from pandas.core.dtypes.dtypes import (
5858
DatetimeTZDtype,
@@ -115,8 +115,10 @@
115115
def _get_next_label(label):
116116
dtype = getattr(label, "dtype", type(label))
117117
if isinstance(label, (Timestamp, Timedelta)):
118-
dtype = "datetime64"
119-
if is_datetime_or_timedelta_dtype(dtype) or isinstance(dtype, DatetimeTZDtype):
118+
dtype = "datetime64[ns]"
119+
dtype = pandas_dtype(dtype)
120+
121+
if lib.is_np_dtype(dtype, "mM") or isinstance(dtype, DatetimeTZDtype):
120122
return label + np.timedelta64(1, "ns")
121123
elif is_integer_dtype(dtype):
122124
return label + 1
@@ -129,8 +131,10 @@ def _get_next_label(label):
129131
def _get_prev_label(label):
130132
dtype = getattr(label, "dtype", type(label))
131133
if isinstance(label, (Timestamp, Timedelta)):
132-
dtype = "datetime64"
133-
if is_datetime_or_timedelta_dtype(dtype) or isinstance(dtype, DatetimeTZDtype):
134+
dtype = "datetime64[ns]"
135+
dtype = pandas_dtype(dtype)
136+
137+
if lib.is_np_dtype(dtype, "mM") or isinstance(dtype, DatetimeTZDtype):
134138
return label - np.timedelta64(1, "ns")
135139
elif is_integer_dtype(dtype):
136140
return label - 1

pandas/core/internals/construction.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
from pandas.core.dtypes.common import (
2929
is_1d_only_ea_dtype,
3030
is_bool_dtype,
31-
is_datetime_or_timedelta_dtype,
3231
is_dtype_equal,
3332
is_float_dtype,
3433
is_integer_dtype,
@@ -349,7 +348,7 @@ def ndarray_to_mgr(
349348
for i in range(values.shape[1])
350349
]
351350
else:
352-
if is_datetime_or_timedelta_dtype(values.dtype):
351+
if lib.is_np_dtype(values.dtype, "mM"):
353352
values = ensure_wrapped_if_datetimelike(values)
354353
arrays = [values[:, i] for i in range(values.shape[1])]
355354

pandas/core/reshape/tile.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
ensure_platform_int,
2525
is_bool_dtype,
2626
is_datetime64_dtype,
27-
is_datetime_or_timedelta_dtype,
2827
is_integer,
2928
is_list_like,
3029
is_numeric_dtype,
@@ -561,7 +560,7 @@ def _convert_bin_to_datelike_type(bins, dtype: DtypeObj | None):
561560
"""
562561
if isinstance(dtype, DatetimeTZDtype):
563562
bins = to_datetime(bins.astype(np.int64), utc=True).tz_convert(dtype.tz)
564-
elif is_datetime_or_timedelta_dtype(dtype):
563+
elif lib.is_np_dtype(dtype, "mM"):
565564
bins = Index(bins.astype(np.int64), dtype=dtype)
566565
return bins
567566

pandas/core/tools/numeric.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
from pandas.core.dtypes.common import (
1515
ensure_object,
1616
is_bool_dtype,
17-
is_datetime_or_timedelta_dtype,
1817
is_decimal,
1918
is_integer_dtype,
2019
is_number,
@@ -213,7 +212,7 @@ def to_numeric(
213212
new_mask: np.ndarray | None = None
214213
if is_numeric_dtype(values_dtype):
215214
pass
216-
elif is_datetime_or_timedelta_dtype(values_dtype):
215+
elif lib.is_np_dtype(values_dtype, "mM"):
217216
values = values.view(np.int64)
218217
else:
219218
values = ensure_object(values)

pandas/tests/dtypes/cast/test_promote.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
from pandas.core.dtypes.common import (
1515
is_complex_dtype,
1616
is_datetime64_dtype,
17-
is_datetime_or_timedelta_dtype,
1817
is_float_dtype,
1918
is_integer_dtype,
2019
is_object_dtype,
@@ -516,7 +515,7 @@ def test_maybe_promote_any_numpy_dtype_with_na(any_numpy_dtype, nulls_fixture):
516515
# but *does* cast None to np.nan
517516
expected_dtype = np.dtype(object)
518517
exp_val_for_scalar = fill_value
519-
elif is_datetime_or_timedelta_dtype(dtype):
518+
elif dtype.kind in "mM":
520519
# datetime / timedelta cast all missing values to dtyped-NaT
521520
expected_dtype = dtype
522521
exp_val_for_scalar = dtype.type("NaT", "ns")

pandas/tests/dtypes/test_common.py

-14
Original file line numberDiff line numberDiff line change
@@ -512,20 +512,6 @@ def test_is_timedelta64_ns_dtype():
512512
assert com.is_timedelta64_ns_dtype(np.array([1, 2], dtype="m8[ns]"))
513513

514514

515-
def test_is_datetime_or_timedelta_dtype():
516-
assert not com.is_datetime_or_timedelta_dtype(int)
517-
assert not com.is_datetime_or_timedelta_dtype(str)
518-
assert not com.is_datetime_or_timedelta_dtype(pd.Series([1, 2]))
519-
assert not com.is_datetime_or_timedelta_dtype(np.array(["a", "b"]))
520-
521-
assert not com.is_datetime_or_timedelta_dtype(DatetimeTZDtype("ns", "US/Eastern"))
522-
523-
assert com.is_datetime_or_timedelta_dtype(np.datetime64)
524-
assert com.is_datetime_or_timedelta_dtype(np.timedelta64)
525-
assert com.is_datetime_or_timedelta_dtype(np.array([], dtype=np.timedelta64))
526-
assert com.is_datetime_or_timedelta_dtype(np.array([], dtype=np.datetime64))
527-
528-
529515
def test_is_numeric_v_string_like():
530516
assert not com.is_numeric_v_string_like(np.array([1]), 1)
531517
assert not com.is_numeric_v_string_like(np.array([1]), np.array([2]))

0 commit comments

Comments
 (0)