diff --git a/pandas/core/dtypes/cast.py b/pandas/core/dtypes/cast.py index b6b9a2ae2aab8..e550309461de4 100644 --- a/pandas/core/dtypes/cast.py +++ b/pandas/core/dtypes/cast.py @@ -2,7 +2,6 @@ Routines for casting. """ -from contextlib import suppress from datetime import date, datetime, timedelta from typing import ( TYPE_CHECKING, @@ -170,20 +169,12 @@ def maybe_downcast_to_dtype(result, dtype: Dtype): dtype = np.dtype(dtype) - elif dtype.type is Period: - from pandas.core.arrays import PeriodArray - - with suppress(TypeError): - # e.g. TypeError: int() argument must be a string, a - # bytes-like object or a number, not 'Period - return PeriodArray(result, freq=dtype.freq) - converted = maybe_downcast_numeric(result, dtype, do_round) if converted is not result: return converted # a datetimelike - # GH12821, iNaT is cast to float + # GH12821, iNaT is casted to float if dtype.kind in ["M", "m"] and result.dtype.kind in ["i", "f"]: if hasattr(dtype, "tz"): # not a numpy dtype @@ -196,6 +187,17 @@ def maybe_downcast_to_dtype(result, dtype: Dtype): else: result = result.astype(dtype) + elif dtype.type is Period: + # TODO(DatetimeArray): merge with previous elif + from pandas.core.arrays import PeriodArray + + try: + return PeriodArray(result, freq=dtype.freq) + except TypeError: + # e.g. TypeError: int() argument must be a string, a + # bytes-like object or a number, not 'Period + pass + return result