4
4
import numpy as np
5
5
6
6
from pandas .core .index import Index , Int64Index
7
- from pandas .tseries .frequencies import infer_freq
8
- from pandas .tseries .tools import parse_time_string
7
+ from pandas .tseries .frequencies import infer_freq , to_offset
8
+ from pandas .tseries .offsets import DateOffset , generate_range , Tick
9
+ from pandas .tseries .tools import parse_time_string , normalize_date
9
10
from pandas .util .decorators import cache_readonly
10
11
import pandas .core .common as com
11
- import pandas .core .datetools as datetools
12
12
import pandas .tseries .tools as tools
13
13
14
14
from pandas ._engines import DatetimeEngine
@@ -170,19 +170,19 @@ def __new__(cls, data=None,
170
170
freq = kwds ['offset' ]
171
171
warn = True
172
172
173
- if not isinstance (freq , datetools . DateOffset ):
174
- freq = datetools . to_offset (freq )
173
+ if not isinstance (freq , DateOffset ):
174
+ freq = to_offset (freq )
175
175
176
176
if warn :
177
177
import warnings
178
178
warnings .warn ("parameter 'offset' is deprecated, "
179
179
"please use 'freq' instead" ,
180
180
FutureWarning )
181
181
if isinstance (freq , basestring ):
182
- freq = datetools . get_offset (freq )
182
+ freq = to_offset (freq )
183
183
else :
184
184
if isinstance (freq , basestring ):
185
- freq = datetools . to_offset (freq )
185
+ freq = to_offset (freq )
186
186
187
187
offset = freq
188
188
@@ -200,7 +200,7 @@ def __new__(cls, data=None,
200
200
% start )
201
201
202
202
if normalize :
203
- start = datetools . normalize_date (start )
203
+ start = normalize_date (start )
204
204
_normalized = True
205
205
else :
206
206
_normalized = _normalized and start .time () == _midnight
@@ -212,7 +212,7 @@ def __new__(cls, data=None,
212
212
% end )
213
213
214
214
if normalize :
215
- end = datetools . normalize_date (end )
215
+ end = normalize_date (end )
216
216
_normalized = True
217
217
else :
218
218
_normalized = _normalized and end .time () == _midnight
@@ -221,7 +221,7 @@ def __new__(cls, data=None,
221
221
222
222
if (offset ._should_cache () and
223
223
not (offset ._normalize_cache and not _normalized ) and
224
- datetools . _naive_in_cache_range (start , end )):
224
+ _naive_in_cache_range (start , end )):
225
225
index = cls ._cached_range (start , end , periods = periods ,
226
226
offset = offset , name = name )
227
227
else :
@@ -310,8 +310,8 @@ def _cached_range(cls, start=None, end=None, periods=None, offset=None,
310
310
311
311
drc = _daterange_cache
312
312
if offset not in _daterange_cache :
313
- xdr = datetools . generate_range (offset = offset ,
314
- start = _CACHE_START , end = _CACHE_END )
313
+ xdr = generate_range (offset = offset , start = _CACHE_START ,
314
+ end = _CACHE_END )
315
315
316
316
arr = np .array (_to_m8_array (list (xdr )),
317
317
dtype = 'M8[us]' , copy = False )
@@ -418,7 +418,7 @@ def __setstate__(self, state):
418
418
def __add__ (self , other ):
419
419
if isinstance (other , Index ):
420
420
return self .union (other )
421
- elif isinstance (other , (datetools . DateOffset , timedelta )):
421
+ elif isinstance (other , (DateOffset , timedelta )):
422
422
new_values = self .astype ('O' ) + other
423
423
return DatetimeIndex (new_values , tz = self .tz )
424
424
else :
@@ -494,7 +494,7 @@ def snap(self, freq='S'):
494
494
495
495
"""
496
496
# Superdumb, punting on any optimizing
497
- freq = datetools . to_offset (freq )
497
+ freq = to_offset (freq )
498
498
499
499
snapped = np .empty (len (self ), dtype = 'M8[us]' )
500
500
@@ -580,7 +580,10 @@ def union(self, other):
580
580
return this ._fast_union (other )
581
581
else :
582
582
result = Index .union (this , other )
583
- result .tz = self .tz
583
+ if isinstance (result , DatetimeIndex ):
584
+ result .tz = self .tz
585
+ if result .freq is None :
586
+ result .offset = to_offset (result .inferred_freq )
584
587
return result
585
588
586
589
def join (self , other , how = 'left' , level = None , return_indexers = False ):
@@ -695,10 +698,19 @@ def intersection(self, other):
695
698
other = DatetimeIndex (other )
696
699
except TypeError :
697
700
pass
698
- return Index .intersection (self , other )
701
+ result = Index .intersection (self , other )
702
+ if isinstance (result , DatetimeIndex ):
703
+ if result .freq is None :
704
+ result .offset = to_offset (result .inferred_freq )
705
+ return result
706
+
699
707
elif other .offset != self .offset or (not self .is_monotonic or
700
708
not other .is_monotonic ):
701
- return Index .intersection (self , other )
709
+ result = Index .intersection (self , other )
710
+ if isinstance (result , DatetimeIndex ):
711
+ if result .freq is None :
712
+ result .offset = to_offset (result .inferred_freq )
713
+ return result
702
714
703
715
# to make our life easier, "sort" the two ranges
704
716
if self [0 ] <= other [0 ]:
@@ -756,7 +768,7 @@ def get_value(self, series, key):
756
768
except KeyError :
757
769
758
770
try :
759
- asdt , parsed , reso = datetools . parse_time_string (key )
771
+ asdt , parsed , reso = parse_time_string (key )
760
772
key = asdt
761
773
loc = self ._partial_date_slice (reso , parsed )
762
774
return series [loc ]
@@ -792,7 +804,7 @@ def get_loc(self, key):
792
804
raise KeyError (stamp )
793
805
794
806
def _get_string_slice (self , key ):
795
- asdt , parsed , reso = datetools . parse_time_string (key )
807
+ asdt , parsed , reso = parse_time_string (key )
796
808
key = asdt
797
809
loc = self ._partial_date_slice (reso , parsed )
798
810
return loc
@@ -858,7 +870,10 @@ def freq(self):
858
870
859
871
@cache_readonly
860
872
def inferred_freq (self ):
861
- return infer_freq (self )
873
+ try :
874
+ return infer_freq (self )
875
+ except ValueError :
876
+ return None
862
877
863
878
@property
864
879
def freqstr (self ):
@@ -1020,7 +1035,7 @@ def tz_validate(self):
1020
1035
1021
1036
# See if there are any DST resolution problems
1022
1037
try :
1023
- lib .tz_localize_array (self .asi8 , self .tz )
1038
+ lib .tz_localize (self .asi8 , self .tz )
1024
1039
except :
1025
1040
return False
1026
1041
@@ -1031,7 +1046,7 @@ def _generate_regular_range(start, end, periods, offset):
1031
1046
if com ._count_not_none (start , end , periods ) < 2 :
1032
1047
raise ValueError ('Must specify two of start, end, or periods' )
1033
1048
1034
- if isinstance (offset , datetools . Tick ):
1049
+ if isinstance (offset , Tick ):
1035
1050
stride = offset .us_stride ()
1036
1051
if periods is None :
1037
1052
b = Timestamp (start ).value
@@ -1049,7 +1064,7 @@ def _generate_regular_range(start, end, periods, offset):
1049
1064
data = np .arange (b , e , stride , dtype = np .int64 )
1050
1065
data = data .view ('M8[us]' )
1051
1066
else :
1052
- xdr = datetools . generate_range (start = start , end = end ,
1067
+ xdr = generate_range (start = start , end = end ,
1053
1068
periods = periods , offset = offset )
1054
1069
1055
1070
data = np .array (list (xdr ), dtype = 'M8[us]' )
0 commit comments