11# -*- coding: utf-8 -*-
22
33import operator
4- from dateutil .relativedelta import relativedelta
4+ import pendulum
5+
56from datetime import datetime , date
67
78from .mixins .interval import WordableIntervalMixin
89from .interval import BaseInterval , Interval
910from .constants import MONTHS_PER_YEAR
11+ from .helpers import precise_diff
1012
1113
1214class Period (WordableIntervalMixin , BaseInterval ):
@@ -16,20 +18,17 @@ class Period(WordableIntervalMixin, BaseInterval):
1618 """
1719
1820 def __new__ (cls , start , end , absolute = False ):
19- from .pendulum import Pendulum
20- from .date import Date
21-
2221 if absolute and start > end :
2322 end , start = start , end
2423
25- if isinstance (start , Pendulum ):
24+ if isinstance (start , pendulum . Pendulum ):
2625 start = start ._datetime
27- elif isinstance (start , Date ):
26+ elif isinstance (start , pendulum . Date ):
2827 start = date (start .year , start .month , start .day )
2928
30- if isinstance (end , Pendulum ):
29+ if isinstance (end , pendulum . Pendulum ):
3130 end = end ._datetime
32- elif isinstance (end , Date ):
31+ elif isinstance (end , pendulum . Date ):
3332 end = date (end .year , end .month , end .day )
3433
3534 delta = end - start
@@ -39,33 +38,30 @@ def __new__(cls, start, end, absolute=False):
3938 )
4039
4140 def __init__ (self , start , end , absolute = False ):
42- from .pendulum import Pendulum
43- from .date import Date
44-
4541 super (Period , self ).__init__ ()
4642
47- if not isinstance (start , (Pendulum , Date )):
43+ if not isinstance (start , (pendulum . Date )):
4844 if isinstance (start , datetime ):
49- start = Pendulum .instance (start )
45+ start = pendulum . Pendulum .instance (start )
5046 else :
51- start = Date .instance (start )
47+ start = pendulum . Date .instance (start )
5248
5349 _start = start
5450 else :
55- if isinstance (start , Pendulum ):
51+ if isinstance (start , pendulum . Pendulum ):
5652 _start = start ._datetime
5753 else :
5854 _start = date (start .year , start .month , start .day )
5955
60- if not isinstance (end , (Pendulum , Date )):
56+ if not isinstance (end , (pendulum . Date )):
6157 if isinstance (end , datetime ):
62- end = Pendulum .instance (end )
58+ end = pendulum . Pendulum .instance (end )
6359 else :
64- end = Date .instance (end )
60+ end = pendulum . Date .instance (end )
6561
6662 _end = end
6763 else :
68- if isinstance (end , Pendulum ):
64+ if isinstance (end , pendulum . Pendulum ):
6965 _end = end ._datetime
7066 else :
7167 _end = date (end .year , end .month , end .day )
@@ -81,27 +77,27 @@ def __init__(self, start, end, absolute=False):
8177 self ._absolute = absolute
8278 self ._start = start
8379 self ._end = end
84- self ._delta = relativedelta ( _end , _start )
80+ self ._delta = precise_diff ( _start , _end )
8581
8682 @property
8783 def years (self ):
88- return self ._delta . years
84+ return self ._delta [ ' years' ]
8985
9086 @property
9187 def months (self ):
92- return self ._delta . months
88+ return self ._delta [ ' months' ]
9389
9490 @property
9591 def weeks (self ):
96- return self ._delta . weeks
92+ return self ._delta [ 'days' ] // 7
9793
9894 @property
9995 def days (self ):
10096 return self ._days
10197
10298 @property
10399 def remaining_days (self ):
104- return abs (self ._delta . days ) % 7 * self ._sign (self ._days )
100+ return abs (self ._delta [ ' days' ] ) % 7 * self ._sign (self ._days )
105101
106102 @property
107103 def start (self ):
0 commit comments