From 56a9d216e29fa46d75bd58d0bb94e06aa2d70690 Mon Sep 17 00:00:00 2001 From: Brock Date: Fri, 26 Feb 2021 08:45:20 -0800 Subject: [PATCH 1/2] API: dont-special-case datetimelike in setting new column --- pandas/core/frame.py | 3 +-- pandas/tests/frame/indexing/test_setitem.py | 13 ++++++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/pandas/core/frame.py b/pandas/core/frame.py index 469783913dc42..1ed143e05ec3a 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -99,7 +99,6 @@ maybe_box_native, maybe_convert_platform, maybe_downcast_to_dtype, - maybe_infer_to_datetimelike, validate_numeric_casting, ) from pandas.core.dtypes.common import ( @@ -4045,7 +4044,7 @@ def _sanitize_column(self, value) -> ArrayLike: # possibly infer to datetimelike if is_object_dtype(value.dtype): - value = maybe_infer_to_datetimelike(value) + value = Series(value)._values else: value = construct_1d_arraylike_from_scalar(value, len(self), dtype=None) diff --git a/pandas/tests/frame/indexing/test_setitem.py b/pandas/tests/frame/indexing/test_setitem.py index f2edfed019bdb..9d61be5887b7e 100644 --- a/pandas/tests/frame/indexing/test_setitem.py +++ b/pandas/tests/frame/indexing/test_setitem.py @@ -421,19 +421,26 @@ def test_setitem_intervals(self): # B & D end up as Categoricals # the remainer are converted to in-line objects - # contining an IntervalIndex.values + # containing an IntervalIndex.values df["B"] = ser df["C"] = np.array(ser) df["D"] = ser.values df["E"] = np.array(ser.values) + df["F"] = ser.astype(object) assert is_categorical_dtype(df["B"].dtype) assert is_interval_dtype(df["B"].cat.categories) assert is_categorical_dtype(df["D"].dtype) assert is_interval_dtype(df["D"].cat.categories) - assert is_object_dtype(df["C"]) - assert is_object_dtype(df["E"]) + # Thes goes through the Series constructor and so get inferred back + # to IntervalDtype + assert is_interval_dtype(df["C"]) + assert is_interval_dtype(df["E"]) + + # But the Series constructor doesn't do inference on Series objects, + # so setting df["F"] doesnt get cast back to IntervalDtype + assert is_object_dtype(df["F"]) # they compare equal as Index # when converted to numpy objects From 2afc9e63468ce3afefc98f56591e81b8c65895c3 Mon Sep 17 00:00:00 2001 From: Brock Date: Fri, 26 Feb 2021 15:47:24 -0800 Subject: [PATCH 2/2] Series -> sanitize_array --- pandas/core/frame.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pandas/core/frame.py b/pandas/core/frame.py index 1ed143e05ec3a..9aa5180133bd4 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -146,6 +146,7 @@ from pandas.core.arrays.sparse import SparseFrameAccessor from pandas.core.construction import ( extract_array, + sanitize_array, sanitize_masked_array, ) from pandas.core.generic import ( @@ -4044,7 +4045,7 @@ def _sanitize_column(self, value) -> ArrayLike: # possibly infer to datetimelike if is_object_dtype(value.dtype): - value = Series(value)._values + value = sanitize_array(value, None) else: value = construct_1d_arraylike_from_scalar(value, len(self), dtype=None)