5
5
6
6
import numpy as np
7
7
8
- from pandas ._libs import NaT , Timestamp , index as libindex , lib , tslib as libts
8
+ from pandas ._libs import (
9
+ NaT ,
10
+ Timedelta ,
11
+ Timestamp ,
12
+ index as libindex ,
13
+ lib ,
14
+ tslib as libts ,
15
+ )
9
16
from pandas ._libs .tslibs import ccalendar , fields , parsing , timezones
10
17
from pandas .util ._decorators import Appender , Substitution , cache_readonly
11
18
31
38
import pandas .core .tools .datetimes as tools
32
39
33
40
from pandas .tseries .frequencies import Resolution , to_offset
34
- from pandas .tseries .offsets import Nano , prefix_mapping
41
+ from pandas .tseries .offsets import prefix_mapping
35
42
36
43
37
44
def _new_DatetimeIndex (cls , d ):
@@ -519,27 +526,27 @@ def _parsed_string_to_bounds(self, reso, parsed):
519
526
raise KeyError
520
527
if reso == "year" :
521
528
start = Timestamp (parsed .year , 1 , 1 )
522
- end = Timestamp (parsed .year , 12 , 31 , 23 , 59 , 59 , 999999 )
529
+ end = Timestamp (parsed .year + 1 , 1 , 1 ) - Timedelta ( nanoseconds = 1 )
523
530
elif reso == "month" :
524
531
d = ccalendar .get_days_in_month (parsed .year , parsed .month )
525
532
start = Timestamp (parsed .year , parsed .month , 1 )
526
- end = Timestamp ( parsed . year , parsed . month , d , 23 , 59 , 59 , 999999 )
533
+ end = start + Timedelta ( days = d , nanoseconds = - 1 )
527
534
elif reso == "quarter" :
528
535
qe = (((parsed .month - 1 ) + 2 ) % 12 ) + 1 # two months ahead
529
536
d = ccalendar .get_days_in_month (parsed .year , qe ) # at end of month
530
537
start = Timestamp (parsed .year , parsed .month , 1 )
531
- end = Timestamp (parsed .year , qe , d , 23 , 59 , 59 , 999999 )
538
+ end = Timestamp (parsed .year , qe , 1 ) + Timedelta ( days = d , nanoseconds = - 1 )
532
539
elif reso == "day" :
533
540
start = Timestamp (parsed .year , parsed .month , parsed .day )
534
- end = start + timedelta (days = 1 ) - Nano ( 1 )
541
+ end = start + Timedelta (days = 1 , nanoseconds = - 1 )
535
542
elif reso == "hour" :
536
543
start = Timestamp (parsed .year , parsed .month , parsed .day , parsed .hour )
537
- end = start + timedelta (hours = 1 ) - Nano ( 1 )
544
+ end = start + Timedelta (hours = 1 , nanoseconds = - 1 )
538
545
elif reso == "minute" :
539
546
start = Timestamp (
540
547
parsed .year , parsed .month , parsed .day , parsed .hour , parsed .minute
541
548
)
542
- end = start + timedelta (minutes = 1 ) - Nano ( 1 )
549
+ end = start + Timedelta (minutes = 1 , nanoseconds = - 1 )
543
550
elif reso == "second" :
544
551
start = Timestamp (
545
552
parsed .year ,
@@ -549,7 +556,7 @@ def _parsed_string_to_bounds(self, reso, parsed):
549
556
parsed .minute ,
550
557
parsed .second ,
551
558
)
552
- end = start + timedelta (seconds = 1 ) - Nano ( 1 )
559
+ end = start + Timedelta (seconds = 1 , nanoseconds = - 1 )
553
560
elif reso == "microsecond" :
554
561
start = Timestamp (
555
562
parsed .year ,
@@ -560,7 +567,7 @@ def _parsed_string_to_bounds(self, reso, parsed):
560
567
parsed .second ,
561
568
parsed .microsecond ,
562
569
)
563
- end = start + timedelta (microseconds = 1 ) - Nano ( 1 )
570
+ end = start + Timedelta (microseconds = 1 , nanoseconds = - 1 )
564
571
# GH 24076
565
572
# If an incoming date string contained a UTC offset, need to localize
566
573
# the parsed date to this offset first before aligning with the index's
0 commit comments