@@ -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