From 3b2f75e2a3d08540cdf008956e4f2d7f994e63f9 Mon Sep 17 00:00:00 2001 From: Alex Rothberg Date: Wed, 18 Sep 2013 00:09:26 -0400 Subject: [PATCH] BUG: Fix for DateOffset's reprs. (GH4638) --- doc/source/release.rst | 2 ++ pandas/tseries/offsets.py | 32 +++++++++++++++------- pandas/tseries/tests/test_offsets.py | 41 +++++++++++++++++++++++----- 3 files changed, 58 insertions(+), 17 deletions(-) diff --git a/doc/source/release.rst b/doc/source/release.rst index ce08a1ca0a175..34720c49b163b 100644 --- a/doc/source/release.rst +++ b/doc/source/release.rst @@ -480,6 +480,8 @@ Bug Fixes - Fixed wrong check for overlapping in ``DatetimeIndex.union`` (:issue:`4564`) - Fixed conflict between thousands separator and date parser in csv_parser (:issue:`4678`) - Fix appending when dtypes are not the same (error showing mixing float/np.datetime64) (:issue:`4993`) + - Fix repr for DateOffset. No longer show duplicate entries in kwds. + Removed unused offset fields. (:issue:`4638`) pandas 0.12.0 ------------- diff --git a/pandas/tseries/offsets.py b/pandas/tseries/offsets.py index bef54a0b37f21..92ed1e415d11a 100644 --- a/pandas/tseries/offsets.py +++ b/pandas/tseries/offsets.py @@ -117,19 +117,31 @@ def __repr__(self): className = getattr(self, '_outputName', type(self).__name__) exclude = set(['n', 'inc']) attrs = [] - for attr in self.__dict__: + for attr in sorted(self.__dict__): if ((attr == 'kwds' and len(self.kwds) == 0) or attr.startswith('_')): continue - if attr not in exclude: - attrs.append('='.join((attr, repr(getattr(self, attr))))) + elif attr == 'kwds': + kwds_new = {} + for key in self.kwds: + if not hasattr(self, key): + kwds_new[key] = self.kwds[key] + if len(kwds_new) > 0: + attrs.append('='.join((attr, repr(kwds_new)))) + else: + if attr not in exclude: + attrs.append('='.join((attr, repr(getattr(self, attr))))) if abs(self.n) != 1: plural = 's' else: plural = '' + + n_str = "" + if self.n != 1: + n_str = "%s * " % self.n - out = '<%s ' % self.n + className + plural + out = '<%s' % n_str + className + plural if attrs: out += ': ' + ', '.join(attrs) out += '>' @@ -247,7 +259,7 @@ def __init__(self, n=1, **kwds): def rule_code(self): return 'B' - def __repr__(self): + def __repr__(self): #TODO: Figure out if this should be merged into DateOffset if hasattr(self, 'name') and len(self.name): return self.name @@ -261,8 +273,12 @@ def __repr__(self): plural = 's' else: plural = '' + + n_str = "" + if self.n != 1: + n_str = "%s * " % self.n - out = '<%s ' % self.n + className + plural + out = '<%s' % n_str + className + plural if attrs: out += ': ' + ', '.join(attrs) out += '>' @@ -741,7 +757,6 @@ def __init__(self, n=1, **kwds): self.n = n self.startingMonth = kwds.get('startingMonth', 3) - self.offset = BMonthEnd(3) self.kwds = kwds def isAnchored(self): @@ -803,7 +818,6 @@ def __init__(self, n=1, **kwds): self.n = n self.startingMonth = kwds.get('startingMonth', 3) - self.offset = BMonthBegin(3) self.kwds = kwds def isAnchored(self): @@ -855,7 +869,6 @@ def __init__(self, n=1, **kwds): self.n = n self.startingMonth = kwds.get('startingMonth', 3) - self.offset = MonthEnd(3) self.kwds = kwds def isAnchored(self): @@ -894,7 +907,6 @@ def __init__(self, n=1, **kwds): self.n = n self.startingMonth = kwds.get('startingMonth', 3) - self.offset = MonthBegin(3) self.kwds = kwds def isAnchored(self): diff --git a/pandas/tseries/tests/test_offsets.py b/pandas/tseries/tests/test_offsets.py index c248e0a5e0de3..5b4e3251683bb 100644 --- a/pandas/tseries/tests/test_offsets.py +++ b/pandas/tseries/tests/test_offsets.py @@ -150,10 +150,10 @@ def test_different_normalize_equals(self): self.assertEqual(offset, offset2) def test_repr(self): - assert repr(self.offset) == '<1 BusinessDay>' - assert repr(self.offset2) == '<2 BusinessDays>' + self.assertEqual(repr(self.offset), '') + assert repr(self.offset2) == '<2 * BusinessDays>' - expected = '<1 BusinessDay: offset=datetime.timedelta(1)>' + expected = '' assert repr(self.offset + timedelta(1)) == expected def test_with_offset(self): @@ -324,10 +324,10 @@ def test_different_normalize_equals(self): self.assertEqual(offset, offset2) def test_repr(self): - assert repr(self.offset) == '<1 CustomBusinessDay>' - assert repr(self.offset2) == '<2 CustomBusinessDays>' + assert repr(self.offset) == '' + assert repr(self.offset2) == '<2 * CustomBusinessDays>' - expected = '<1 BusinessDay: offset=datetime.timedelta(1)>' + expected = '' assert repr(self.offset + timedelta(1)) == expected def test_with_offset(self): @@ -526,6 +526,11 @@ def assertOnOffset(offset, date, expected): class TestWeek(unittest.TestCase): + def test_repr(self): + self.assertEqual(repr(Week(weekday=0)), "") + self.assertEqual(repr(Week(n=-1, weekday=0)), "<-1 * Week: weekday=0>") + self.assertEqual(repr(Week(n=-2, weekday=0)), "<-2 * Weeks: weekday=0>") + def test_corner(self): self.assertRaises(ValueError, Week, weekday=7) assertRaisesRegexp(ValueError, "Day must be", Week, weekday=-1) @@ -598,6 +603,9 @@ def test_constructor(self): assertRaisesRegexp(ValueError, "^Day", WeekOfMonth, n=1, week=0, weekday=-1) assertRaisesRegexp(ValueError, "^Day", WeekOfMonth, n=1, week=0, weekday=7) + def test_repr(self): + self.assertEqual(repr(WeekOfMonth(weekday=1,week=2)), "") + def test_offset(self): date1 = datetime(2011, 1, 4) # 1st Tuesday of Month date2 = datetime(2011, 1, 11) # 2nd Tuesday of Month @@ -895,6 +903,11 @@ def test_onOffset(self): class TestBQuarterBegin(unittest.TestCase): + + def test_repr(self): + self.assertEqual(repr(BQuarterBegin()),"") + self.assertEqual(repr(BQuarterBegin(startingMonth=3)), "") + self.assertEqual(repr(BQuarterBegin(startingMonth=1)), "") def test_isAnchored(self): self.assert_(BQuarterBegin(startingMonth=1).isAnchored()) @@ -981,6 +994,11 @@ def test_offset(self): class TestBQuarterEnd(unittest.TestCase): + def test_repr(self): + self.assertEqual(repr(BQuarterEnd()),"") + self.assertEqual(repr(BQuarterEnd(startingMonth=3)), "") + self.assertEqual(repr(BQuarterEnd(startingMonth=1)), "") + def test_isAnchored(self): self.assert_(BQuarterEnd(startingMonth=1).isAnchored()) self.assert_(BQuarterEnd().isAnchored()) @@ -1083,6 +1101,11 @@ def test_onOffset(self): class TestQuarterBegin(unittest.TestCase): + def test_repr(self): + self.assertEqual(repr(QuarterBegin()), "") + self.assertEqual(repr(QuarterBegin(startingMonth=3)), "") + self.assertEqual(repr(QuarterBegin(startingMonth=1)),"") + def test_isAnchored(self): self.assert_(QuarterBegin(startingMonth=1).isAnchored()) self.assert_(QuarterBegin().isAnchored()) @@ -1152,7 +1175,11 @@ def test_offset(self): class TestQuarterEnd(unittest.TestCase): - + def test_repr(self): + self.assertEqual(repr(QuarterEnd()), "") + self.assertEqual(repr(QuarterEnd(startingMonth=3)), "") + self.assertEqual(repr(QuarterEnd(startingMonth=1)), "") + def test_isAnchored(self): self.assert_(QuarterEnd(startingMonth=1).isAnchored()) self.assert_(QuarterEnd().isAnchored())