Skip to content

Commit 73b3e19

Browse files
authored
CLN/REF: de-duplicate DatetimeTZBlock.setitem (#37019)
1 parent 50d61b2 commit 73b3e19

File tree

1 file changed

+15
-16
lines changed

1 file changed

+15
-16
lines changed

pandas/core/internals/blocks.py

+15-16
Original file line numberDiff line numberDiff line change
@@ -1758,6 +1758,14 @@ def setitem(self, indexer, value):
17581758
`indexer` is a direct slice/positional indexer. `value` must
17591759
be a compatible shape.
17601760
"""
1761+
if not self._can_hold_element(value):
1762+
# This is only relevant for DatetimeTZBlock, which has a
1763+
# non-trivial `_can_hold_element`.
1764+
# https://github.com/pandas-dev/pandas/issues/24020
1765+
# Need a dedicated setitem until GH#24020 (type promotion in setitem
1766+
# for extension arrays) is designed and implemented.
1767+
return self.astype(object).setitem(indexer, value)
1768+
17611769
if isinstance(indexer, tuple):
17621770
# TODO(EA2D): not needed with 2D EAs
17631771
# we are always 1-D
@@ -2175,7 +2183,13 @@ def astype(self, dtype, copy: bool = False, errors: str = "raise"):
21752183
def _can_hold_element(self, element: Any) -> bool:
21762184
tipo = maybe_infer_dtype_type(element)
21772185
if tipo is not None:
2178-
if self.is_datetimetz:
2186+
if isinstance(element, list) and len(element) == 0:
2187+
# Following DatetimeArray._validate_setitem_value
2188+
# convention, we treat this as object-dtype
2189+
# (even though tipo is float64)
2190+
return True
2191+
2192+
elif self.is_datetimetz:
21792193
# require exact match, since non-nano does not exist
21802194
return is_dtype_equal(tipo, self.dtype) or is_valid_nat_for_dtype(
21812195
element, self.dtype
@@ -2339,21 +2353,6 @@ def fillna(self, value, limit=None, inplace=False, downcast=None):
23392353
value, limit=limit, inplace=inplace, downcast=downcast
23402354
)
23412355

2342-
def setitem(self, indexer, value):
2343-
# https://github.com/pandas-dev/pandas/issues/24020
2344-
# Need a dedicated setitem until #24020 (type promotion in setitem
2345-
# for extension arrays) is designed and implemented.
2346-
if self._can_hold_element(value) or (
2347-
isinstance(indexer, np.ndarray) and indexer.size == 0
2348-
):
2349-
return super().setitem(indexer, value)
2350-
2351-
obj_vals = self.values.astype(object)
2352-
newb = make_block(
2353-
obj_vals, placement=self.mgr_locs, klass=ObjectBlock, ndim=self.ndim
2354-
)
2355-
return newb.setitem(indexer, value)
2356-
23572356
def quantile(self, qs, interpolation="linear", axis=0):
23582357
naive = self.values.view("M8[ns]")
23592358

0 commit comments

Comments
 (0)