diff --git a/pandas/core/dtypes/cast.py b/pandas/core/dtypes/cast.py index 36c713cab7123..f227eb46273a5 100644 --- a/pandas/core/dtypes/cast.py +++ b/pandas/core/dtypes/cast.py @@ -41,7 +41,6 @@ IntCastingNaNError, LossySetitemError, ) -from pandas.util._validators import validate_bool_kwarg from pandas.core.dtypes.common import ( DT64NS_DTYPE, @@ -952,54 +951,6 @@ def coerce_indexer_dtype(indexer, categories) -> np.ndarray: return ensure_int64(indexer) -def soft_convert_objects( - values: np.ndarray, - *, - datetime: bool = True, - timedelta: bool = True, - period: bool = True, - copy: bool = True, -) -> ArrayLike: - """ - Try to coerce datetime, timedelta, and numeric object-dtype columns - to inferred dtype. - - Parameters - ---------- - values : np.ndarray[object] - datetime : bool, default True - timedelta : bool, default True - period : bool, default True - copy : bool, default True - - Returns - ------- - np.ndarray or ExtensionArray - """ - validate_bool_kwarg(datetime, "datetime") - validate_bool_kwarg(timedelta, "timedelta") - validate_bool_kwarg(copy, "copy") - - conversion_count = sum((datetime, timedelta)) - if conversion_count == 0: - raise ValueError("At least one of datetime or timedelta must be True.") - - # Soft conversions - if datetime or timedelta or period: - # GH 20380, when datetime is beyond year 2262, hence outside - # bound of nanosecond-resolution 64-bit integers. - converted = lib.maybe_convert_objects( - values, - convert_datetime=datetime, - convert_timedelta=timedelta, - convert_period=period, - ) - if converted is not values: - return converted - - return values - - def convert_dtypes( input_array: ArrayLike, convert_string: bool = True, diff --git a/pandas/core/generic.py b/pandas/core/generic.py index d1e48a3d10a1e..37b7af13fc7c4 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -6354,9 +6354,8 @@ def infer_objects(self: NDFrameT) -> NDFrameT: A int64 dtype: object """ - return self._constructor( - self._mgr.convert(datetime=True, timedelta=True, copy=True) - ).__finalize__(self, method="infer_objects") + new_mgr = self._mgr.convert() + return self._constructor(new_mgr).__finalize__(self, method="infer_objects") @final def convert_dtypes( diff --git a/pandas/core/internals/array_manager.py b/pandas/core/internals/array_manager.py index 8ddab458e35a9..918c70ff91da5 100644 --- a/pandas/core/internals/array_manager.py +++ b/pandas/core/internals/array_manager.py @@ -32,7 +32,6 @@ from pandas.core.dtypes.cast import ( ensure_dtype_can_hold_na, infer_dtype_from_scalar, - soft_convert_objects, ) from pandas.core.dtypes.common import ( ensure_platform_int, @@ -375,25 +374,19 @@ def fillna(self: T, value, limit, inplace: bool, downcast) -> T: def astype(self: T, dtype, copy: bool = False, errors: str = "raise") -> T: return self.apply(astype_array_safe, dtype=dtype, copy=copy, errors=errors) - def convert( - self: T, - *, - copy: bool = True, - datetime: bool = True, - timedelta: bool = True, - ) -> T: + def convert(self: T) -> T: def _convert(arr): if is_object_dtype(arr.dtype): # extract PandasArray for tests that patch PandasArray._typ arr = np.asarray(arr) - return soft_convert_objects( + return lib.maybe_convert_objects( arr, - datetime=datetime, - timedelta=timedelta, - copy=copy, + convert_datetime=True, + convert_timedelta=True, + convert_period=True, ) else: - return arr.copy() if copy else arr + return arr.copy() return self.apply(_convert) diff --git a/pandas/core/internals/blocks.py b/pandas/core/internals/blocks.py index 57a0fc81515c5..95300c888eede 100644 --- a/pandas/core/internals/blocks.py +++ b/pandas/core/internals/blocks.py @@ -44,7 +44,6 @@ find_result_type, maybe_downcast_to_dtype, np_can_hold_element, - soft_convert_objects, ) from pandas.core.dtypes.common import ( ensure_platform_int, @@ -429,7 +428,7 @@ def _maybe_downcast(self, blocks: list[Block], downcast=None) -> list[Block]: # but ATM it breaks too much existing code. # split and convert the blocks - return extend_blocks([blk.convert(datetime=True) for blk in blocks]) + return extend_blocks([blk.convert() for blk in blocks]) if downcast is None: return blocks @@ -451,8 +450,6 @@ def convert( self, *, copy: bool = True, - datetime: bool = True, - timedelta: bool = True, ) -> list[Block]: """ attempt to coerce any object types to better types return a copy @@ -1967,8 +1964,6 @@ def convert( self, *, copy: bool = True, - datetime: bool = True, - timedelta: bool = True, ) -> list[Block]: """ attempt to cast any object types to better types return a copy of @@ -1980,11 +1975,11 @@ def convert( # avoid doing .ravel as that might make a copy values = values[0] - res_values = soft_convert_objects( + res_values = lib.maybe_convert_objects( values, - datetime=datetime, - timedelta=timedelta, - copy=copy, + convert_datetime=True, + convert_timedelta=True, + convert_period=True, ) res_values = ensure_block_shape(res_values, self.ndim) return [self.make_block(res_values)] diff --git a/pandas/core/internals/managers.py b/pandas/core/internals/managers.py index 306fea06963ec..d1eee23f1908c 100644 --- a/pandas/core/internals/managers.py +++ b/pandas/core/internals/managers.py @@ -441,18 +441,10 @@ def fillna(self: T, value, limit, inplace: bool, downcast) -> T: def astype(self: T, dtype, copy: bool = False, errors: str = "raise") -> T: return self.apply("astype", dtype=dtype, copy=copy, errors=errors) - def convert( - self: T, - *, - copy: bool = True, - datetime: bool = True, - timedelta: bool = True, - ) -> T: + def convert(self: T) -> T: return self.apply( "convert", - copy=copy, - datetime=datetime, - timedelta=timedelta, + copy=True, ) def replace(self: T, to_replace, value, inplace: bool) -> T: