Skip to content

Commit 3108604

Browse files
author
y-p
committed
Merge pull request #3224 from y-p/GH2891
PeriodIndex pickle roundtrip does not recreate freq GH2891
2 parents 900a552 + a25fcba commit 3108604

File tree

3 files changed

+35
-0
lines changed

3 files changed

+35
-0
lines changed

pandas/tests/test_series.py

+10
Original file line numberDiff line numberDiff line change
@@ -1324,6 +1324,16 @@ def test_timeseries_repr_object_dtype(self):
13241324
ts2 = ts.ix[np.random.randint(0, len(ts) - 1, 400)]
13251325
repr(ts).splitlines()[-1]
13261326

1327+
def test_timeseries_periodindex(self):
1328+
# GH2891
1329+
import pickle
1330+
from pandas import period_range
1331+
prng = period_range('1/1/2011', '1/1/2012', freq='M')
1332+
ts = Series(np.random.randn(len(prng)), prng)
1333+
new_ts = pickle.loads(pickle.dumps(ts))
1334+
self.assertEqual(new_ts.index.freq,'M')
1335+
1336+
13271337
def test_iter(self):
13281338
for i, val in enumerate(self.series):
13291339
self.assertEqual(val, self.series[i])

pandas/tseries/period.py

+19
Original file line numberDiff line numberDiff line change
@@ -1115,6 +1115,25 @@ def append(self, other):
11151115
for x in to_concat]
11161116
return Index(com._concat_compat(to_concat), name=name)
11171117

1118+
def __reduce__(self):
1119+
"""Necessary for making this object picklable"""
1120+
object_state = list(np.ndarray.__reduce__(self))
1121+
subclass_state = (self.name, self.freq)
1122+
object_state[2] = (object_state[2], subclass_state)
1123+
return tuple(object_state)
1124+
1125+
def __setstate__(self, state):
1126+
"""Necessary for making this object picklable"""
1127+
if len(state) == 2:
1128+
nd_state, own_state = state
1129+
np.ndarray.__setstate__(self, nd_state)
1130+
self.name = own_state[0]
1131+
try: # backcompat
1132+
self.freq = own_state[1]
1133+
except:
1134+
pass
1135+
else: # pragma: no cover
1136+
np.ndarray.__setstate__(self, state)
11181137

11191138
def _get_ordinal_range(start, end, periods, freq):
11201139
if com._count_not_none(start, end, periods) < 2:

pandas/tseries/tests/test_period.py

+6
Original file line numberDiff line numberDiff line change
@@ -1946,6 +1946,12 @@ def test_append_concat(self):
19461946
self.assert_(isinstance(result.index, PeriodIndex))
19471947
self.assertEquals(result.index[0], s1.index[0])
19481948

1949+
def test_pickle_freq(self):
1950+
# GH2891
1951+
import pickle
1952+
prng = period_range('1/1/2011', '1/1/2012', freq='M')
1953+
new_prng = pickle.loads(pickle.dumps(prng))
1954+
self.assertEqual(new_prng.freq,'M')
19491955

19501956
def _permute(obj):
19511957
return obj.take(np.random.permutation(len(obj)))

0 commit comments

Comments
 (0)