Skip to content

Commit 3b2f75e

Browse files
committed
BUG: Fix for DateOffset's reprs. (GH4638)
1 parent 2b5e525 commit 3b2f75e

File tree

3 files changed

+58
-17
lines changed

3 files changed

+58
-17
lines changed

doc/source/release.rst

+2
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,8 @@ Bug Fixes
480480
- Fixed wrong check for overlapping in ``DatetimeIndex.union`` (:issue:`4564`)
481481
- Fixed conflict between thousands separator and date parser in csv_parser (:issue:`4678`)
482482
- Fix appending when dtypes are not the same (error showing mixing float/np.datetime64) (:issue:`4993`)
483+
- Fix repr for DateOffset. No longer show duplicate entries in kwds.
484+
Removed unused offset fields. (:issue:`4638`)
483485

484486
pandas 0.12.0
485487
-------------

pandas/tseries/offsets.py

+22-10
Original file line numberDiff line numberDiff line change
@@ -117,19 +117,31 @@ def __repr__(self):
117117
className = getattr(self, '_outputName', type(self).__name__)
118118
exclude = set(['n', 'inc'])
119119
attrs = []
120-
for attr in self.__dict__:
120+
for attr in sorted(self.__dict__):
121121
if ((attr == 'kwds' and len(self.kwds) == 0)
122122
or attr.startswith('_')):
123123
continue
124-
if attr not in exclude:
125-
attrs.append('='.join((attr, repr(getattr(self, attr)))))
124+
elif attr == 'kwds':
125+
kwds_new = {}
126+
for key in self.kwds:
127+
if not hasattr(self, key):
128+
kwds_new[key] = self.kwds[key]
129+
if len(kwds_new) > 0:
130+
attrs.append('='.join((attr, repr(kwds_new))))
131+
else:
132+
if attr not in exclude:
133+
attrs.append('='.join((attr, repr(getattr(self, attr)))))
126134

127135
if abs(self.n) != 1:
128136
plural = 's'
129137
else:
130138
plural = ''
139+
140+
n_str = ""
141+
if self.n != 1:
142+
n_str = "%s * " % self.n
131143

132-
out = '<%s ' % self.n + className + plural
144+
out = '<%s' % n_str + className + plural
133145
if attrs:
134146
out += ': ' + ', '.join(attrs)
135147
out += '>'
@@ -247,7 +259,7 @@ def __init__(self, n=1, **kwds):
247259
def rule_code(self):
248260
return 'B'
249261

250-
def __repr__(self):
262+
def __repr__(self): #TODO: Figure out if this should be merged into DateOffset
251263
if hasattr(self, 'name') and len(self.name):
252264
return self.name
253265

@@ -261,8 +273,12 @@ def __repr__(self):
261273
plural = 's'
262274
else:
263275
plural = ''
276+
277+
n_str = ""
278+
if self.n != 1:
279+
n_str = "%s * " % self.n
264280

265-
out = '<%s ' % self.n + className + plural
281+
out = '<%s' % n_str + className + plural
266282
if attrs:
267283
out += ': ' + ', '.join(attrs)
268284
out += '>'
@@ -741,7 +757,6 @@ def __init__(self, n=1, **kwds):
741757
self.n = n
742758
self.startingMonth = kwds.get('startingMonth', 3)
743759

744-
self.offset = BMonthEnd(3)
745760
self.kwds = kwds
746761

747762
def isAnchored(self):
@@ -803,7 +818,6 @@ def __init__(self, n=1, **kwds):
803818
self.n = n
804819
self.startingMonth = kwds.get('startingMonth', 3)
805820

806-
self.offset = BMonthBegin(3)
807821
self.kwds = kwds
808822

809823
def isAnchored(self):
@@ -855,7 +869,6 @@ def __init__(self, n=1, **kwds):
855869
self.n = n
856870
self.startingMonth = kwds.get('startingMonth', 3)
857871

858-
self.offset = MonthEnd(3)
859872
self.kwds = kwds
860873

861874
def isAnchored(self):
@@ -894,7 +907,6 @@ def __init__(self, n=1, **kwds):
894907
self.n = n
895908
self.startingMonth = kwds.get('startingMonth', 3)
896909

897-
self.offset = MonthBegin(3)
898910
self.kwds = kwds
899911

900912
def isAnchored(self):

pandas/tseries/tests/test_offsets.py

+34-7
Original file line numberDiff line numberDiff line change
@@ -150,10 +150,10 @@ def test_different_normalize_equals(self):
150150
self.assertEqual(offset, offset2)
151151

152152
def test_repr(self):
153-
assert repr(self.offset) == '<1 BusinessDay>'
154-
assert repr(self.offset2) == '<2 BusinessDays>'
153+
self.assertEqual(repr(self.offset), '<BusinessDay>')
154+
assert repr(self.offset2) == '<2 * BusinessDays>'
155155

156-
expected = '<1 BusinessDay: offset=datetime.timedelta(1)>'
156+
expected = '<BusinessDay: offset=datetime.timedelta(1)>'
157157
assert repr(self.offset + timedelta(1)) == expected
158158

159159
def test_with_offset(self):
@@ -324,10 +324,10 @@ def test_different_normalize_equals(self):
324324
self.assertEqual(offset, offset2)
325325

326326
def test_repr(self):
327-
assert repr(self.offset) == '<1 CustomBusinessDay>'
328-
assert repr(self.offset2) == '<2 CustomBusinessDays>'
327+
assert repr(self.offset) == '<CustomBusinessDay>'
328+
assert repr(self.offset2) == '<2 * CustomBusinessDays>'
329329

330-
expected = '<1 BusinessDay: offset=datetime.timedelta(1)>'
330+
expected = '<BusinessDay: offset=datetime.timedelta(1)>'
331331
assert repr(self.offset + timedelta(1)) == expected
332332

333333
def test_with_offset(self):
@@ -526,6 +526,11 @@ def assertOnOffset(offset, date, expected):
526526

527527

528528
class TestWeek(unittest.TestCase):
529+
def test_repr(self):
530+
self.assertEqual(repr(Week(weekday=0)), "<Week: weekday=0>")
531+
self.assertEqual(repr(Week(n=-1, weekday=0)), "<-1 * Week: weekday=0>")
532+
self.assertEqual(repr(Week(n=-2, weekday=0)), "<-2 * Weeks: weekday=0>")
533+
529534
def test_corner(self):
530535
self.assertRaises(ValueError, Week, weekday=7)
531536
assertRaisesRegexp(ValueError, "Day must be", Week, weekday=-1)
@@ -598,6 +603,9 @@ def test_constructor(self):
598603
assertRaisesRegexp(ValueError, "^Day", WeekOfMonth, n=1, week=0, weekday=-1)
599604
assertRaisesRegexp(ValueError, "^Day", WeekOfMonth, n=1, week=0, weekday=7)
600605

606+
def test_repr(self):
607+
self.assertEqual(repr(WeekOfMonth(weekday=1,week=2)), "<WeekOfMonth: week=2, weekday=1>")
608+
601609
def test_offset(self):
602610
date1 = datetime(2011, 1, 4) # 1st Tuesday of Month
603611
date2 = datetime(2011, 1, 11) # 2nd Tuesday of Month
@@ -895,6 +903,11 @@ def test_onOffset(self):
895903

896904

897905
class TestBQuarterBegin(unittest.TestCase):
906+
907+
def test_repr(self):
908+
self.assertEqual(repr(BQuarterBegin()),"<BusinessQuarterBegin: startingMonth=3>")
909+
self.assertEqual(repr(BQuarterBegin(startingMonth=3)), "<BusinessQuarterBegin: startingMonth=3>")
910+
self.assertEqual(repr(BQuarterBegin(startingMonth=1)), "<BusinessQuarterBegin: startingMonth=1>")
898911

899912
def test_isAnchored(self):
900913
self.assert_(BQuarterBegin(startingMonth=1).isAnchored())
@@ -981,6 +994,11 @@ def test_offset(self):
981994

982995
class TestBQuarterEnd(unittest.TestCase):
983996

997+
def test_repr(self):
998+
self.assertEqual(repr(BQuarterEnd()),"<BusinessQuarterEnd: startingMonth=3>")
999+
self.assertEqual(repr(BQuarterEnd(startingMonth=3)), "<BusinessQuarterEnd: startingMonth=3>")
1000+
self.assertEqual(repr(BQuarterEnd(startingMonth=1)), "<BusinessQuarterEnd: startingMonth=1>")
1001+
9841002
def test_isAnchored(self):
9851003
self.assert_(BQuarterEnd(startingMonth=1).isAnchored())
9861004
self.assert_(BQuarterEnd().isAnchored())
@@ -1083,6 +1101,11 @@ def test_onOffset(self):
10831101

10841102

10851103
class TestQuarterBegin(unittest.TestCase):
1104+
def test_repr(self):
1105+
self.assertEqual(repr(QuarterBegin()), "<QuarterBegin: startingMonth=3>")
1106+
self.assertEqual(repr(QuarterBegin(startingMonth=3)), "<QuarterBegin: startingMonth=3>")
1107+
self.assertEqual(repr(QuarterBegin(startingMonth=1)),"<QuarterBegin: startingMonth=1>")
1108+
10861109
def test_isAnchored(self):
10871110
self.assert_(QuarterBegin(startingMonth=1).isAnchored())
10881111
self.assert_(QuarterBegin().isAnchored())
@@ -1152,7 +1175,11 @@ def test_offset(self):
11521175

11531176

11541177
class TestQuarterEnd(unittest.TestCase):
1155-
1178+
def test_repr(self):
1179+
self.assertEqual(repr(QuarterEnd()), "<QuarterEnd: startingMonth=3>")
1180+
self.assertEqual(repr(QuarterEnd(startingMonth=3)), "<QuarterEnd: startingMonth=3>")
1181+
self.assertEqual(repr(QuarterEnd(startingMonth=1)), "<QuarterEnd: startingMonth=1>")
1182+
11561183
def test_isAnchored(self):
11571184
self.assert_(QuarterEnd(startingMonth=1).isAnchored())
11581185
self.assert_(QuarterEnd().isAnchored())

0 commit comments

Comments
 (0)