@@ -95,6 +95,8 @@ def get_freq_code(freqstr):
95
95
code = _period_str_to_code (freqstr [0 ])
96
96
stride = freqstr [1 ]
97
97
except :
98
+ if com .is_integer (freqstr [1 ]):
99
+ raise
98
100
code = _period_str_to_code (freqstr [1 ])
99
101
stride = freqstr [0 ]
100
102
return code , stride
@@ -227,10 +229,10 @@ def get_period_alias(offset_str):
227
229
'us' : 'U'
228
230
}
229
231
232
+ #TODO: Can this be killed?
230
233
for _i , _weekday in enumerate (['MON' , 'TUE' , 'WED' , 'THU' , 'FRI' ]):
231
234
for _iweek in range (4 ):
232
235
_name = 'WOM-%d%s' % (_iweek + 1 , _weekday )
233
- _offset_map [_name ] = offsets .WeekOfMonth (week = _iweek , weekday = _i )
234
236
_rule_aliases [_name .replace ('-' , '@' )] = _name
235
237
236
238
# Note that _rule_aliases is not 1:1 (d[BA]==d[A@DEC]), and so traversal
@@ -301,7 +303,7 @@ def to_offset(freqstr):
301
303
302
304
303
305
# 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\- ]+)?)' )
305
307
306
308
307
309
def _base_and_stride (freqstr ):
@@ -356,16 +358,16 @@ def get_offset(name):
356
358
else :
357
359
if name in _rule_aliases :
358
360
name = _rule_aliases [name ]
359
- try :
360
- if name not in _offset_map :
361
+
362
+ if name not in _offset_map :
363
+ try :
361
364
# generate and cache offset
362
365
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 ]
369
371
370
372
371
373
getOffset = get_offset
@@ -401,9 +403,6 @@ def get_legacy_offset_name(offset):
401
403
name = offset .name
402
404
return _legacy_reverse_map .get (name , name )
403
405
404
- get_offset_name = get_offset_name
405
-
406
-
407
406
def get_standard_freq (freq ):
408
407
"""
409
408
Return the standardized frequency string
@@ -621,8 +620,12 @@ def _period_str_to_code(freqstr):
621
620
try :
622
621
freqstr = freqstr .upper ()
623
622
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
+
626
629
return _period_code_map [alias ]
627
630
628
631
@@ -839,16 +842,21 @@ def _get_monthly_rule(self):
839
842
'ce' : 'M' , 'be' : 'BM' }.get (pos_check )
840
843
841
844
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
845
849
846
850
weekdays = unique (self .index .weekday )
847
851
if len (weekdays ) > 1 :
848
852
return None
853
+
854
+ week_of_months = unique ((self .index .day - 1 ) // 7 )
855
+ if len (week_of_months ) > 1 :
856
+ return None
849
857
850
858
# get which week
851
- week = ( self . index [0 ]. day - 1 ) // 7 + 1
859
+ week = week_of_months [0 ] + 1
852
860
wd = _weekday_rule_aliases [weekdays [0 ]]
853
861
854
862
return 'WOM-%d%s' % (week , wd )
0 commit comments