From 2dc85a9d521dbc63e681469905ddbee131b0e512 Mon Sep 17 00:00:00 2001 From: Brock Mendel Date: Wed, 6 Sep 2017 10:26:53 -0700 Subject: [PATCH 1/2] Use cache_readonly attrs to minimize attrs set in __init__ This is a step towards making dateOffset immutable, is an approach suggested by @shoyer --- pandas/tseries/offsets.py | 44 +++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/pandas/tseries/offsets.py b/pandas/tseries/offsets.py index 7ccecaa84e6d6..9267002acbee1 100644 --- a/pandas/tseries/offsets.py +++ b/pandas/tseries/offsets.py @@ -11,6 +11,7 @@ from dateutil.relativedelta import relativedelta, weekday from dateutil.easter import easter from pandas._libs import tslib, Timestamp, OutOfBoundsDatetime, Timedelta +from pandas.util._decorators import cache_readonly import functools import operator @@ -938,12 +939,14 @@ def __init__(self, n=1, normalize=False, **kwds): self.normalize = normalize super(BusinessHour, self).__init__(**kwds) + @cache_readonly + def next_bday(self): # used for moving to next businessday if self.n >= 0: nb_offset = 1 else: nb_offset = -1 - self.next_bday = BusinessDay(n=nb_offset) + return BusinessDay(n=nb_offset) class CustomBusinessDay(BusinessDay): @@ -1570,6 +1573,7 @@ class Week(DateOffset): Always generate specific day of week. 0 for Monday """ _adjust_dst = True + _inc = timedelta(weeks=1) def __init__(self, n=1, normalize=False, **kwds): self.n = n @@ -1581,7 +1585,6 @@ def __init__(self, n=1, normalize=False, **kwds): raise ValueError('Day must be 0<=day<=6, got {day}' .format(day=self.weekday)) - self._inc = timedelta(weeks=1) self.kwds = kwds def isAnchored(self): @@ -1985,13 +1988,6 @@ class QuarterEnd(QuarterOffset): _default_startingMonth = 3 _prefix = 'Q' - def __init__(self, n=1, normalize=False, **kwds): - self.n = n - self.normalize = normalize - self.startingMonth = kwds.get('startingMonth', 3) - - self.kwds = kwds - def isAnchored(self): return (self.n == 1 and self.startingMonth is not None) @@ -2324,12 +2320,28 @@ def __init__(self, n=1, normalize=False, **kwds): raise ValueError('{variation} is not a valid variation' .format(variation=self.variation)) + @cache_readonly + def _rd_forward(self): + if self.variation == "nearest": + weekday_offset = weekday(self.weekday) + return relativedelta(weekday=weekday_offset) + else: + return None + + @cache_readonly + def _rd_backward(self): if self.variation == "nearest": weekday_offset = weekday(self.weekday) - self._rd_forward = relativedelta(weekday=weekday_offset) - self._rd_backward = relativedelta(weekday=weekday_offset(-1)) + return relativedelta(weekday=weekday_offset(-1)) else: - self._offset_lwom = LastWeekOfMonth(n=1, weekday=self.weekday) + return None + + @cache_readonly + def _offset_lwom(self): + if self.variation == "nearest": + return None + else: + return LastWeekOfMonth(n=1, weekday=self.weekday) def isAnchored(self): return self.n == 1 \ @@ -2550,7 +2562,10 @@ def __init__(self, n=1, normalize=False, **kwds): if self.n == 0: raise ValueError('N cannot be 0') - self._offset = FY5253( + @cache_readonly + def _offset(self): + kwds = self.kwds + return FY5253( startingMonth=kwds['startingMonth'], weekday=kwds["weekday"], variation=kwds["variation"]) @@ -2660,9 +2675,6 @@ class Easter(DateOffset): """ _adjust_dst = True - def __init__(self, n=1, **kwds): - super(Easter, self).__init__(n, **kwds) - @apply_wraps def apply(self, other): currentEaster = easter(other.year) From d2d4e66b190098082bd03d0297e72102f4a70890 Mon Sep 17 00:00:00 2001 From: Brock Mendel Date: Wed, 6 Sep 2017 19:52:57 -0700 Subject: [PATCH 2/2] Spell out names per reviewer comments --- pandas/tseries/offsets.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pandas/tseries/offsets.py b/pandas/tseries/offsets.py index 9267002acbee1..36aeff35d3923 100644 --- a/pandas/tseries/offsets.py +++ b/pandas/tseries/offsets.py @@ -2321,7 +2321,7 @@ def __init__(self, n=1, normalize=False, **kwds): .format(variation=self.variation)) @cache_readonly - def _rd_forward(self): + def _relativedelta_forward(self): if self.variation == "nearest": weekday_offset = weekday(self.weekday) return relativedelta(weekday=weekday_offset) @@ -2329,7 +2329,7 @@ def _rd_forward(self): return None @cache_readonly - def _rd_backward(self): + def _relativedelta_backward(self): if self.variation == "nearest": weekday_offset = weekday(self.weekday) return relativedelta(weekday=weekday_offset(-1)) @@ -2445,8 +2445,8 @@ def _get_year_end_nearest(self, dt): if target_date.weekday() == self.weekday: return target_date else: - forward = target_date + self._rd_forward - backward = target_date + self._rd_backward + forward = target_date + self._relativedelta_forward + backward = target_date + self._relativedelta_backward if forward - target_date < target_date - backward: return forward