@@ -1758,6 +1758,14 @@ def setitem(self, indexer, value):
1758
1758
`indexer` is a direct slice/positional indexer. `value` must
1759
1759
be a compatible shape.
1760
1760
"""
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
+
1761
1769
if isinstance (indexer , tuple ):
1762
1770
# TODO(EA2D): not needed with 2D EAs
1763
1771
# we are always 1-D
@@ -2175,7 +2183,13 @@ def astype(self, dtype, copy: bool = False, errors: str = "raise"):
2175
2183
def _can_hold_element (self , element : Any ) -> bool :
2176
2184
tipo = maybe_infer_dtype_type (element )
2177
2185
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 :
2179
2193
# require exact match, since non-nano does not exist
2180
2194
return is_dtype_equal (tipo , self .dtype ) or is_valid_nat_for_dtype (
2181
2195
element , self .dtype
@@ -2339,21 +2353,6 @@ def fillna(self, value, limit=None, inplace=False, downcast=None):
2339
2353
value , limit = limit , inplace = inplace , downcast = downcast
2340
2354
)
2341
2355
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
-
2357
2356
def quantile (self , qs , interpolation = "linear" , axis = 0 ):
2358
2357
naive = self .values .view ("M8[ns]" )
2359
2358
0 commit comments