Skip to content

Commit a94ff3b

Browse files
jbrockmendeljreback
authored andcommitted
Fix PeriodIndex._shallow_copy allowing object-dtype (pandas-dev#30713)
1 parent 554e4f6 commit a94ff3b

File tree

3 files changed

+8
-12
lines changed

3 files changed

+8
-12
lines changed

pandas/core/indexes/api.py

+1
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ def conv(i):
198198
result = indexes[0]
199199

200200
if hasattr(result, "union_many"):
201+
# DatetimeIndex
201202
return result.union_many(indexes[1:])
202203
else:
203204
for other in indexes[1:]:

pandas/core/indexes/base.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -1947,7 +1947,7 @@ def dropna(self, how="any"):
19471947
raise ValueError(f"invalid how option: {how}")
19481948

19491949
if self.hasnans:
1950-
return self._shallow_copy(self.values[~self._isnan])
1950+
return self._shallow_copy(self._values[~self._isnan])
19511951
return self._shallow_copy()
19521952

19531953
# --------------------------------------------------------------------
@@ -2568,11 +2568,11 @@ def symmetric_difference(self, other, result_name=None, sort=None):
25682568
left_indexer = np.setdiff1d(
25692569
np.arange(this.size), common_indexer, assume_unique=True
25702570
)
2571-
left_diff = this.values.take(left_indexer)
2571+
left_diff = this._values.take(left_indexer)
25722572

25732573
# {other} minus {this}
25742574
right_indexer = (indexer == -1).nonzero()[0]
2575-
right_diff = other.values.take(right_indexer)
2575+
right_diff = other._values.take(right_indexer)
25762576

25772577
the_diff = concat_compat([left_diff, right_diff])
25782578
if sort is None:

pandas/core/indexes/period.py

+4-9
Original file line numberDiff line numberDiff line change
@@ -272,19 +272,14 @@ def _shallow_copy(self, values=None, **kwargs):
272272
values = self._data
273273

274274
if isinstance(values, type(self)):
275-
values = values._values
275+
values = values._data
276276

277277
if not isinstance(values, PeriodArray):
278-
if isinstance(values, np.ndarray) and is_integer_dtype(values.dtype):
278+
if isinstance(values, np.ndarray) and values.dtype == "i8":
279279
values = PeriodArray(values, freq=self.freq)
280280
else:
281-
# in particular, I would like to avoid period_array here.
282-
# Some people seem to be calling use with unexpected types
283-
# Index.difference -> ndarray[Period]
284-
# DatetimelikeIndexOpsMixin.repeat -> ndarray[ordinal]
285-
# I think that once all of Datetime* are EAs, we can simplify
286-
# this quite a bit.
287-
values = period_array(values, freq=self.freq)
281+
# GH#30713 this should never be reached
282+
raise TypeError(type(values), getattr(values, "dtype", None))
288283

289284
# We don't allow changing `freq` in _shallow_copy.
290285
validate_dtype_freq(self.dtype, kwargs.get("freq"))

0 commit comments

Comments
 (0)