Skip to content

Commit 6b6712b

Browse files
author
y-p
committed
Merge pull request #3560 from cpcloud/period-index-unicode-evaling-3460
ENH: unicode of PeriodIndex returns valid Python code
2 parents 04b5eb0 + 9512c1a commit 6b6712b

File tree

2 files changed

+96
-0
lines changed

2 files changed

+96
-0
lines changed

pandas/tseries/period.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1102,6 +1102,25 @@ def __repr__(self):
11021102
output += 'length: %d' % len(self)
11031103
return output
11041104

1105+
def __unicode__(self):
1106+
output = self.__class__.__name__
1107+
output += u'('
1108+
prefix = '' if py3compat.PY3 else 'u'
1109+
mapper = "{0}'{{0}}'".format(prefix)
1110+
output += '[{0}]'.format(', '.join(map(mapper.format, self)))
1111+
output += ", freq='{0}'".format(self.freq)
1112+
output += ')'
1113+
return output
1114+
1115+
def __bytes__(self):
1116+
encoding = com.get_option('display.encoding')
1117+
return self.__unicode__().encode(encoding, 'replace')
1118+
1119+
def __str__(self):
1120+
if py3compat.PY3:
1121+
return self.__unicode__()
1122+
return self.__bytes__()
1123+
11051124
def take(self, indices, axis=None):
11061125
"""
11071126
Analogous to ndarray.take

pandas/tseries/tests/test_period.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1616,6 +1616,83 @@ def test_ts_repr(self):
16161616
ts = Series(np.random.randn(len(index)), index=index)
16171617
repr(ts)
16181618

1619+
def test_period_index_unicode(self):
1620+
pi = PeriodIndex(freq='A', start='1/1/2001', end='12/1/2009')
1621+
assert_equal(len(pi), 9)
1622+
assert_equal(pi, eval(unicode(pi)))
1623+
1624+
pi = PeriodIndex(freq='Q', start='1/1/2001', end='12/1/2009')
1625+
assert_equal(len(pi), 4 * 9)
1626+
assert_equal(pi, eval(unicode(pi)))
1627+
1628+
pi = PeriodIndex(freq='M', start='1/1/2001', end='12/1/2009')
1629+
assert_equal(len(pi), 12 * 9)
1630+
assert_equal(pi, eval(unicode(pi)))
1631+
1632+
start = Period('02-Apr-2005', 'B')
1633+
i1 = PeriodIndex(start=start, periods=20)
1634+
assert_equal(len(i1), 20)
1635+
assert_equal(i1.freq, start.freq)
1636+
assert_equal(i1[0], start)
1637+
assert_equal(i1, eval(unicode(i1)))
1638+
1639+
end_intv = Period('2006-12-31', 'W')
1640+
i1 = PeriodIndex(end=end_intv, periods=10)
1641+
assert_equal(len(i1), 10)
1642+
assert_equal(i1.freq, end_intv.freq)
1643+
assert_equal(i1[-1], end_intv)
1644+
assert_equal(i1, eval(unicode(i1)))
1645+
1646+
end_intv = Period('2006-12-31', '1w')
1647+
i2 = PeriodIndex(end=end_intv, periods=10)
1648+
assert_equal(len(i1), len(i2))
1649+
self.assert_((i1 == i2).all())
1650+
assert_equal(i1.freq, i2.freq)
1651+
assert_equal(i1, eval(unicode(i1)))
1652+
assert_equal(i2, eval(unicode(i2)))
1653+
1654+
end_intv = Period('2006-12-31', ('w', 1))
1655+
i2 = PeriodIndex(end=end_intv, periods=10)
1656+
assert_equal(len(i1), len(i2))
1657+
self.assert_((i1 == i2).all())
1658+
assert_equal(i1.freq, i2.freq)
1659+
assert_equal(i1, eval(unicode(i1)))
1660+
assert_equal(i2, eval(unicode(i2)))
1661+
1662+
try:
1663+
PeriodIndex(start=start, end=end_intv)
1664+
raise AssertionError('Cannot allow mixed freq for start and end')
1665+
except ValueError:
1666+
pass
1667+
1668+
end_intv = Period('2005-05-01', 'B')
1669+
i1 = PeriodIndex(start=start, end=end_intv)
1670+
assert_equal(i1, eval(unicode(i1)))
1671+
1672+
try:
1673+
PeriodIndex(start=start)
1674+
raise AssertionError(
1675+
'Must specify periods if missing start or end')
1676+
except ValueError:
1677+
pass
1678+
1679+
# infer freq from first element
1680+
i2 = PeriodIndex([end_intv, Period('2005-05-05', 'B')])
1681+
assert_equal(len(i2), 2)
1682+
assert_equal(i2[0], end_intv)
1683+
assert_equal(i2, eval(unicode(i2)))
1684+
1685+
i2 = PeriodIndex(np.array([end_intv, Period('2005-05-05', 'B')]))
1686+
assert_equal(len(i2), 2)
1687+
assert_equal(i2[0], end_intv)
1688+
assert_equal(i2, eval(unicode(i2)))
1689+
1690+
# Mixed freq should fail
1691+
vals = [end_intv, Period('2006-12-31', 'w')]
1692+
self.assertRaises(ValueError, PeriodIndex, vals)
1693+
vals = np.array(vals)
1694+
self.assertRaises(ValueError, PeriodIndex, vals)
1695+
16191696
def test_frame_index_to_string(self):
16201697
index = PeriodIndex(['2011-1', '2011-2', '2011-3'], freq='M')
16211698
frame = DataFrame(np.random.randn(3, 4), index=index)

0 commit comments

Comments
 (0)