Skip to content

Commit 71d6105

Browse files
authored
BUG: pickle after _with_freq (#33811)
1 parent f3fdab3 commit 71d6105

File tree

4 files changed

+22
-19
lines changed

4 files changed

+22
-19
lines changed

Diff for: pandas/core/arrays/datetimelike.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -410,15 +410,15 @@ def ceil(self, freq, ambiguous="raise", nonexistent="raise"):
410410

411411
def _with_freq(self, freq):
412412
"""
413-
Helper to set our freq in-place, returning self to allow method chaining.
413+
Helper to get a view on the same data, with a new freq.
414414
415415
Parameters
416416
----------
417417
freq : DateOffset, None, or "infer"
418418
419419
Returns
420420
-------
421-
self
421+
Same type as self
422422
"""
423423
# GH#29843
424424
if freq is None:
@@ -433,8 +433,9 @@ def _with_freq(self, freq):
433433
assert freq == "infer"
434434
freq = frequencies.to_offset(self.inferred_freq)
435435

436-
self._freq = freq
437-
return self
436+
arr = self.view()
437+
arr._freq = freq
438+
return arr
438439

439440

440441
class DatetimeLikeArrayMixin(

Diff for: pandas/core/indexes/datetimelike.py

+3-15
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
from pandas.core.ops import get_op_result_name
4545
from pandas.core.tools.timedeltas import to_timedelta
4646

47-
from pandas.tseries.frequencies import DateOffset, to_offset
47+
from pandas.tseries.frequencies import DateOffset
4848
from pandas.tseries.offsets import Tick
4949

5050
_index_doc_kwargs = dict(ibase._index_doc_kwargs)
@@ -678,20 +678,8 @@ def freqstr(self):
678678
return self.freq.freqstr
679679

680680
def _with_freq(self, freq):
681-
index = self.copy(deep=False)
682-
if freq is None:
683-
# Even if we _can_ have a freq, we might want to set it to None
684-
index._freq = None
685-
elif len(self) == 0 and isinstance(freq, DateOffset):
686-
# Always valid. In the TimedeltaArray case, we assume this
687-
# is a Tick offset.
688-
index._freq = freq
689-
else:
690-
assert freq == "infer", freq
691-
freq = to_offset(self.inferred_freq)
692-
index._freq = freq
693-
694-
return index
681+
arr = self._data._with_freq(freq)
682+
return type(self)._simple_new(arr, name=self.name)
695683

696684
def _shallow_copy(self, values=None, name: Label = lib.no_default):
697685
name = self.name if name is lib.no_default else name

Diff for: pandas/tests/indexes/datetimes/test_datetime.py

+7
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,13 @@ def test_pickle(self):
3838
idx_p = tm.round_trip_pickle(idx)
3939
tm.assert_index_equal(idx, idx_p)
4040

41+
def test_pickle_after_set_freq(self):
42+
dti = date_range("20130101", periods=3, tz="US/Eastern", name="foo")
43+
dti = dti._with_freq(None)
44+
45+
res = tm.round_trip_pickle(dti)
46+
tm.assert_index_equal(res, dti)
47+
4148
def test_reindex_preserves_tz_if_target_is_empty_list_or_array(self):
4249
# GH7774
4350
index = date_range("20130101", periods=3, tz="US/Eastern")

Diff for: pandas/tests/indexes/timedeltas/test_timedelta.py

+7
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,13 @@ def test_shift(self):
4747
def test_pickle_compat_construction(self):
4848
pass
4949

50+
def test_pickle_after_set_freq(self):
51+
tdi = timedelta_range("1 day", periods=4, freq="s")
52+
tdi = tdi._with_freq(None)
53+
54+
res = tm.round_trip_pickle(tdi)
55+
tm.assert_index_equal(res, tdi)
56+
5057
def test_isin(self):
5158

5259
index = tm.makeTimedeltaIndex(4)

0 commit comments

Comments
 (0)