@@ -95,6 +95,8 @@ def get_freq_code(freqstr):
9595 code = _period_str_to_code (freqstr [0 ])
9696 stride = freqstr [1 ]
9797 except :
98+ if com .is_integer (freqstr [1 ]):
99+ raise
98100 code = _period_str_to_code (freqstr [1 ])
99101 stride = freqstr [0 ]
100102 return code , stride
@@ -227,10 +229,10 @@ def get_period_alias(offset_str):
227229 'us' : 'U'
228230}
229231
232+ #TODO: Can this be killed?
230233for _i , _weekday in enumerate (['MON' , 'TUE' , 'WED' , 'THU' , 'FRI' ]):
231234 for _iweek in range (4 ):
232235 _name = 'WOM-%d%s' % (_iweek + 1 , _weekday )
233- _offset_map [_name ] = offsets .WeekOfMonth (week = _iweek , weekday = _i )
234236 _rule_aliases [_name .replace ('-' , '@' )] = _name
235237
236238# Note that _rule_aliases is not 1:1 (d[BA]==d[A@DEC]), and so traversal
@@ -301,7 +303,7 @@ def to_offset(freqstr):
301303
302304
303305# hack to handle WOM-1MON
304- opattern = re .compile (r'([\-]?\d*)\s*([A-Za-z]+([\-@]\d*[A -Za-z]+)?)' )
306+ opattern = re .compile (r'([\-]?\d*)\s*([A-Za-z]+([\-@][\dA -Za-z\- ]+)?)' )
305307
306308
307309def _base_and_stride (freqstr ):
@@ -356,16 +358,16 @@ def get_offset(name):
356358 else :
357359 if name in _rule_aliases :
358360 name = _rule_aliases [name ]
359- try :
360- if name not in _offset_map :
361+
362+ if name not in _offset_map :
363+ try :
361364 # generate and cache offset
362365 offset = _make_offset (name )
363- _offset_map [name ] = offset
364- return _offset_map [name ]
365- except (ValueError , TypeError , KeyError ):
366- # bad prefix or suffix
367- pass
368- raise ValueError ('Bad rule name requested: %s.' % name )
366+ except (ValueError , TypeError , KeyError ):
367+ # bad prefix or suffix
368+ raise ValueError ('Bad rule name requested: %s.' % name )
369+ _offset_map [name ] = offset
370+ return _offset_map [name ]
369371
370372
371373getOffset = get_offset
@@ -401,9 +403,6 @@ def get_legacy_offset_name(offset):
401403 name = offset .name
402404 return _legacy_reverse_map .get (name , name )
403405
404- get_offset_name = get_offset_name
405-
406-
407406def get_standard_freq (freq ):
408407 """
409408 Return the standardized frequency string
@@ -621,8 +620,12 @@ def _period_str_to_code(freqstr):
621620 try :
622621 freqstr = freqstr .upper ()
623622 return _period_code_map [freqstr ]
624- except :
625- alias = _period_alias_dict [freqstr ]
623+ except KeyError :
624+ try :
625+ alias = _period_alias_dict [freqstr ]
626+ except KeyError :
627+ raise ValueError ("Unknown freqstr: %s" % freqstr )
628+
626629 return _period_code_map [alias ]
627630
628631
@@ -839,16 +842,21 @@ def _get_monthly_rule(self):
839842 'ce' : 'M' , 'be' : 'BM' }.get (pos_check )
840843
841844 def _get_wom_rule (self ):
842- wdiffs = unique (np .diff (self .index .week ))
843- if not lib .ismember (wdiffs , set ([4 , 5 ])).all ():
844- return None
845+ # wdiffs = unique(np.diff(self.index.week))
846+ #We also need -47, -49, -48 to catch index spanning year boundary
847+ # if not lib.ismember(wdiffs, set([4, 5, -47, -49, -48])).all():
848+ # return None
845849
846850 weekdays = unique (self .index .weekday )
847851 if len (weekdays ) > 1 :
848852 return None
853+
854+ week_of_months = unique ((self .index .day - 1 ) // 7 )
855+ if len (week_of_months ) > 1 :
856+ return None
849857
850858 # get which week
851- week = ( self . index [0 ]. day - 1 ) // 7 + 1
859+ week = week_of_months [0 ] + 1
852860 wd = _weekday_rule_aliases [weekdays [0 ]]
853861
854862 return 'WOM-%d%s' % (week , wd )
0 commit comments