diff --git a/doc/source/user_guide/io.rst b/doc/source/user_guide/io.rst index cf153ddd2cbbd..3b7a6037a9715 100644 --- a/doc/source/user_guide/io.rst +++ b/doc/source/user_guide/io.rst @@ -5240,6 +5240,7 @@ Write to a feather file. Read from a feather file. .. ipython:: python + :okwarning: result = pd.read_feather("example.feather") result @@ -5323,6 +5324,7 @@ Write to a parquet file. Read from a parquet file. .. ipython:: python + :okwarning: result = pd.read_parquet("example_fp.parquet", engine="fastparquet") result = pd.read_parquet("example_pa.parquet", engine="pyarrow") diff --git a/pandas/core/internals/array_manager.py b/pandas/core/internals/array_manager.py index 34b3d83c066c2..acadfcbbdf302 100644 --- a/pandas/core/internals/array_manager.py +++ b/pandas/core/internals/array_manager.py @@ -61,9 +61,7 @@ from pandas.core.arrays import ( DatetimeArray, ExtensionArray, - IntervalArray, PandasArray, - PeriodArray, TimedeltaArray, ) from pandas.core.arrays.sparse import SparseDtype @@ -87,6 +85,7 @@ ) from pandas.core.internals.blocks import ( ensure_block_shape, + external_values, new_block, to_native_types, ) @@ -1203,12 +1202,7 @@ def dtype(self): def external_values(self): """The array that Series.values returns""" - if isinstance(self.array, (PeriodArray, IntervalArray)): - return self.array.astype(object) - elif isinstance(self.array, (DatetimeArray, TimedeltaArray)): - return self.array._data - else: - return self.array + return external_values(self.array) def internal_values(self): """The array that Series._values returns""" diff --git a/pandas/core/internals/blocks.py b/pandas/core/internals/blocks.py index 174ea8760b0db..01660e34300ce 100644 --- a/pandas/core/internals/blocks.py +++ b/pandas/core/internals/blocks.py @@ -96,7 +96,9 @@ ExtensionArray, FloatingArray, IntegerArray, + IntervalArray, PandasArray, + PeriodArray, TimedeltaArray, ) from pandas.core.base import PandasObject @@ -217,16 +219,9 @@ def is_view(self) -> bool: def is_categorical(self) -> bool: return self._holder is Categorical + @final def external_values(self): - """ - The array that Series.values returns (public attribute). - - This has some historical constraints, and is overridden in block - subclasses to return the correct array (e.g. period returns - object ndarray and datetimetz a datetime64[ns] ndarray instead of - proper extension array). - """ - return self.values + return external_values(self.values) def internal_values(self): """ @@ -1770,8 +1765,7 @@ class ObjectValuesExtensionBlock(HybridMixin, ExtensionBlock): Series[T].values is an ndarray of objects. """ - def external_values(self): - return self.values.astype(object) + pass class NumericBlock(Block): @@ -1956,12 +1950,6 @@ def is_view(self) -> bool: # check the ndarray values of the DatetimeIndex values return self.values._data.base is not None - def external_values(self): - # NB: this is different from np.asarray(self.values), since that - # return an object-dtype ndarray of Timestamps. - # Avoid FutureWarning in .astype in casting from dt64tz to dt64 - return self.values._data - class TimeDeltaBlock(DatetimeLikeBlockMixin): __slots__ = () @@ -2296,3 +2284,23 @@ def to_native_types( values[mask] = na_rep values = values.astype(object, copy=False) return values + + +def external_values(values: ArrayLike) -> ArrayLike: + """ + The array that Series.values returns (public attribute). + + This has some historical constraints, and is overridden in block + subclasses to return the correct array (e.g. period returns + object ndarray and datetimetz a datetime64[ns] ndarray instead of + proper extension array). + """ + if isinstance(values, (PeriodArray, IntervalArray)): + return values.astype(object) + elif isinstance(values, (DatetimeArray, TimedeltaArray)): + # NB: for datetime64tz this is different from np.asarray(values), since + # that returns an object-dtype ndarray of Timestamps. + # Avoid FutureWarning in .astype in casting from dt64tz to dt64 + return values._data + else: + return values