Skip to content

Commit 8d8df82

Browse files
committed
Operate on categories
1 parent 0de9955 commit 8d8df82

File tree

2 files changed

+28
-4
lines changed

2 files changed

+28
-4
lines changed

pandas/core/indexes/accessors.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
from pandas.core.dtypes.generic import ABCSeries
1717

1818
from pandas.core.accessor import PandasDelegate, delegate_names
19-
from pandas.core.algorithms import take_1d
2019
from pandas.core.arrays import DatetimeArray, PeriodArray, TimedeltaArray
2120
from pandas.core.base import NoNewAttributesMixin, PandasObject
2221
from pandas.core.indexes.datetimes import DatetimeIndex
@@ -75,9 +74,7 @@ def _delegate_property_get(self, name):
7574

7675
result = np.asarray(result)
7776

78-
# blow up if we operate on categories
7977
if self.orig is not None:
80-
result = take_1d(result, self.orig.cat.codes)
8178
index = self.orig.index
8279
else:
8380
index = self._parent.index
@@ -324,7 +321,11 @@ def __new__(cls, data):
324321

325322
orig = data if is_categorical_dtype(data) else None
326323
if orig is not None:
327-
data = Series(orig.values.categories, name=orig.name, copy=False)
324+
data = Series(
325+
orig.values.astype(orig.values.categories.dtype),
326+
name=orig.name,
327+
copy=False,
328+
)
328329

329330
if is_datetime64_dtype(data.dtype):
330331
return DatetimeProperties(data, orig)

pandas/tests/indexes/test_category.py

+23
Original file line numberDiff line numberDiff line change
@@ -1125,3 +1125,26 @@ def test_engine_type(self, dtype, engine_type):
11251125
ci.values._codes = ci.values._codes.astype("int64")
11261126
assert np.issubdtype(ci.codes.dtype, dtype)
11271127
assert isinstance(ci._engine, engine_type)
1128+
1129+
def test_dt_tz_localize(self, tz_aware_fixture):
1130+
# GH 27952
1131+
tz = tz_aware_fixture
1132+
datetimes = pd.Series(
1133+
["2019-01-01", "2019-01-01", "2019-01-02"], dtype="datetime64[ns]"
1134+
)
1135+
categorical = datetimes.astype("category")
1136+
result = categorical.dt.tz_localize(tz)
1137+
expected = datetimes.dt.tz_localize(tz)
1138+
tm.assert_series_equal(result, expected)
1139+
1140+
@pytest.mark.parametrize("accessor", [("year"), ("month"), ("day")])
1141+
def test_dt_other_accessors(self, accessor):
1142+
# GH 27952
1143+
tz = None
1144+
datetimes = pd.Series(
1145+
["2018-01-01", "2018-01-01", "2019-01-02"], dtype="datetime64[ns]"
1146+
)
1147+
categorical = datetimes.astype("category")
1148+
result = getattr(categorical.dt, accessor)
1149+
expected = getattr(datetimes.dt, accessor)
1150+
tm.assert_series_equal(result, expected)

0 commit comments

Comments
 (0)