diff --git a/asv_bench/benchmarks/inference.py b/asv_bench/benchmarks/inference.py index e85b3bd2c7687..2455cfbbb21df 100644 --- a/asv_bench/benchmarks/inference.py +++ b/asv_bench/benchmarks/inference.py @@ -1,6 +1,9 @@ +import datetime + import numpy as np -from pandas import DataFrame, Series, to_numeric +from pandas import DataFrame, Series, Timestamp, to_numeric +from pandas.core.common import maybe_box_datetimelike import pandas.util.testing as tm from .pandas_vb_common import lib, numeric_dtypes @@ -52,7 +55,6 @@ def time_add_timedeltas(self, df): class ToNumeric: - params = ["ignore", "coerce"] param_names = ["errors"] @@ -73,7 +75,6 @@ def time_from_str(self, errors): class ToNumericDowncast: - param_names = ["dtype", "downcast"] params = [ [ @@ -121,4 +122,16 @@ def time_convert(self, data): lib.maybe_convert_numeric(data, set(), coerce_numeric=False) +class MaybeBoxDatetimelike: + def setup(self): + self.pd_timestamp = Timestamp.now() + self.py_timestamp = datetime.datetime.now() + + def pd_datetime_box(self): + maybe_box_datetimelike(self.pd_timestamp) + + def py_datetime_box(self): + maybe_box_datetimelike(self.py_timestamp) + + from .pandas_vb_common import setup # noqa: F401 isort:skip diff --git a/pandas/core/common.py b/pandas/core/common.py index 8a430a4aa7d11..512d6e1398104 100644 --- a/pandas/core/common.py +++ b/pandas/core/common.py @@ -73,7 +73,6 @@ def consensus_name_attr(objs): def maybe_box(indexer, values, obj, key): - # if we have multiples coming back, box em if isinstance(values, np.ndarray): return obj[indexer.get_loc(key)] @@ -85,6 +84,11 @@ def maybe_box(indexer, values, obj, key): def maybe_box_datetimelike(value): # turn a datetime like into a Timestamp/timedelta as needed + if isinstance(value, (tslibs.Timedelta, tslibs.Timestamp)) or ( + value is tslibs.NaT + ): + return value + if isinstance(value, (np.datetime64, datetime)): value = tslibs.Timestamp(value) elif isinstance(value, (np.timedelta64, timedelta)): @@ -216,7 +220,6 @@ def try_sort(iterable): def asarray_tuplesafe(values, dtype=None): - if not (isinstance(values, (list, tuple)) or hasattr(values, "__array__")): values = list(values) elif isinstance(values, ABCIndexClass):