7
7
8
8
from pandas ._libs import NaT , Period , Timestamp , index as libindex , lib , tslib
9
9
from pandas ._libs .tslibs import Resolution , fields , parsing , timezones , to_offset
10
- from pandas ._libs .tslibs .frequencies import get_freq_group
11
10
from pandas ._libs .tslibs .offsets import prefix_mapping
12
11
from pandas ._typing import DtypeObj , Label
13
12
from pandas .util ._decorators import cache_readonly
@@ -470,7 +469,7 @@ def snap(self, freq="S"):
470
469
dta = DatetimeArray (snapped , dtype = self .dtype )
471
470
return DatetimeIndex ._simple_new (dta , name = self .name )
472
471
473
- def _parsed_string_to_bounds (self , reso : str , parsed : datetime ):
472
+ def _parsed_string_to_bounds (self , reso : Resolution , parsed : datetime ):
474
473
"""
475
474
Calculate datetime bounds for parsed time string and its resolution.
476
475
@@ -485,6 +484,7 @@ def _parsed_string_to_bounds(self, reso: str, parsed: datetime):
485
484
-------
486
485
lower, upper: pd.Timestamp
487
486
"""
487
+ assert isinstance (reso , Resolution ), (type (reso ), reso )
488
488
valid_resos = {
489
489
"year" ,
490
490
"month" ,
@@ -497,10 +497,10 @@ def _parsed_string_to_bounds(self, reso: str, parsed: datetime):
497
497
"second" ,
498
498
"microsecond" ,
499
499
}
500
- if reso not in valid_resos :
500
+ if reso . attrname not in valid_resos :
501
501
raise KeyError
502
502
503
- grp = get_freq_group ( reso )
503
+ grp = reso . freq_group
504
504
per = Period (parsed , freq = grp )
505
505
start , end = per .start_time , per .end_time
506
506
@@ -521,11 +521,12 @@ def _parsed_string_to_bounds(self, reso: str, parsed: datetime):
521
521
end = end .tz_localize (self .tz )
522
522
return start , end
523
523
524
- def _validate_partial_date_slice (self , reso : str ):
524
+ def _validate_partial_date_slice (self , reso : Resolution ):
525
+ assert isinstance (reso , Resolution ), (type (reso ), reso )
525
526
if (
526
527
self .is_monotonic
527
- and reso in ["day" , "hour" , "minute" , "second" ]
528
- and self ._resolution_obj >= Resolution . from_attrname ( reso )
528
+ and reso . attrname in ["day" , "hour" , "minute" , "second" ]
529
+ and self ._resolution_obj >= reso
529
530
):
530
531
# These resolution/monotonicity validations came from GH3931,
531
532
# GH3452 and GH2369.
@@ -625,6 +626,7 @@ def _maybe_cast_slice_bound(self, label, side: str, kind):
625
626
if isinstance (label , str ):
626
627
freq = getattr (self , "freqstr" , getattr (self , "inferred_freq" , None ))
627
628
parsed , reso = parsing .parse_time_string (label , freq )
629
+ reso = Resolution .from_attrname (reso )
628
630
lower , upper = self ._parsed_string_to_bounds (reso , parsed )
629
631
# lower, upper form the half-open interval:
630
632
# [parsed, parsed + 1 freq)
@@ -641,6 +643,7 @@ def _maybe_cast_slice_bound(self, label, side: str, kind):
641
643
def _get_string_slice (self , key : str , use_lhs : bool = True , use_rhs : bool = True ):
642
644
freq = getattr (self , "freqstr" , getattr (self , "inferred_freq" , None ))
643
645
parsed , reso = parsing .parse_time_string (key , freq )
646
+ reso = Resolution .from_attrname (reso )
644
647
loc = self ._partial_date_slice (reso , parsed , use_lhs = use_lhs , use_rhs = use_rhs )
645
648
return loc
646
649
0 commit comments