@@ -1473,7 +1473,7 @@ def test_timestamp_fields(self):
14731473 # extra fields from DatetimeIndex like quarter and week
14741474 idx = tm .makeDateIndex (100 )
14751475
1476- fields = ['dayofweek' , 'dayofyear' , 'week' , 'weekofyear' , 'quarter' ]
1476+ fields = ['dayofweek' , 'dayofyear' , 'week' , 'weekofyear' , 'quarter' , 'is_month_start' , 'is_month_end' , 'is_quarter_start' , 'is_quarter_end' , 'is_year_start' , 'is_year_end' ]
14771477 for f in fields :
14781478 expected = getattr (idx , f )[- 1 ]
14791479 result = getattr (Timestamp (idx [- 1 ]), f )
@@ -2192,7 +2192,7 @@ def test_join_with_period_index(self):
21922192
21932193class TestDatetime64 (tm .TestCase ):
21942194 """
2195- Also test supoprt for datetime64[ns] in Series / DataFrame
2195+ Also test support for datetime64[ns] in Series / DataFrame
21962196 """
21972197
21982198 def setUp (self ):
@@ -2202,37 +2202,115 @@ def setUp(self):
22022202
22032203 def test_datetimeindex_accessors (self ):
22042204 dti = DatetimeIndex (
2205- freq = 'Q-JAN ' , start = datetime (1997 , 12 , 31 ), periods = 100 )
2205+ freq = 'D ' , start = datetime (1998 , 1 , 1 ), periods = 365 )
22062206
22072207 self .assertEquals (dti .year [0 ], 1998 )
22082208 self .assertEquals (dti .month [0 ], 1 )
2209- self .assertEquals (dti .day [0 ], 31 )
2209+ self .assertEquals (dti .day [0 ], 1 )
22102210 self .assertEquals (dti .hour [0 ], 0 )
22112211 self .assertEquals (dti .minute [0 ], 0 )
22122212 self .assertEquals (dti .second [0 ], 0 )
22132213 self .assertEquals (dti .microsecond [0 ], 0 )
2214- self .assertEquals (dti .dayofweek [0 ], 5 )
2214+ self .assertEquals (dti .dayofweek [0 ], 3 )
22152215
2216- self .assertEquals (dti .dayofyear [0 ], 31 )
2217- self .assertEquals (dti .dayofyear [1 ], 120 )
2216+ self .assertEquals (dti .dayofyear [0 ], 1 )
2217+ self .assertEquals (dti .dayofyear [120 ], 121 )
22182218
2219- self .assertEquals (dti .weekofyear [0 ], 5 )
2220- self .assertEquals (dti .weekofyear [1 ], 18 )
2219+ self .assertEquals (dti .weekofyear [0 ], 1 )
2220+ self .assertEquals (dti .weekofyear [120 ], 18 )
22212221
22222222 self .assertEquals (dti .quarter [0 ], 1 )
2223- self .assertEquals (dti .quarter [1 ], 2 )
2224-
2225- self .assertEquals (len (dti .year ), 100 )
2226- self .assertEquals (len (dti .month ), 100 )
2227- self .assertEquals (len (dti .day ), 100 )
2228- self .assertEquals (len (dti .hour ), 100 )
2229- self .assertEquals (len (dti .minute ), 100 )
2230- self .assertEquals (len (dti .second ), 100 )
2231- self .assertEquals (len (dti .microsecond ), 100 )
2232- self .assertEquals (len (dti .dayofweek ), 100 )
2233- self .assertEquals (len (dti .dayofyear ), 100 )
2234- self .assertEquals (len (dti .weekofyear ), 100 )
2235- self .assertEquals (len (dti .quarter ), 100 )
2223+ self .assertEquals (dti .quarter [120 ], 2 )
2224+
2225+ self .assertEquals (dti .is_month_start [0 ], True )
2226+ self .assertEquals (dti .is_month_start [1 ], False )
2227+ self .assertEquals (dti .is_month_start [31 ], True )
2228+ self .assertEquals (dti .is_quarter_start [0 ], True )
2229+ self .assertEquals (dti .is_quarter_start [90 ], True )
2230+ self .assertEquals (dti .is_year_start [0 ], True )
2231+ self .assertEquals (dti .is_year_start [364 ], False )
2232+ self .assertEquals (dti .is_month_end [0 ], False )
2233+ self .assertEquals (dti .is_month_end [30 ], True )
2234+ self .assertEquals (dti .is_month_end [31 ], False )
2235+ self .assertEquals (dti .is_month_end [364 ], True )
2236+ self .assertEquals (dti .is_quarter_end [0 ], False )
2237+ self .assertEquals (dti .is_quarter_end [30 ], False )
2238+ self .assertEquals (dti .is_quarter_end [89 ], True )
2239+ self .assertEquals (dti .is_quarter_end [364 ], True )
2240+ self .assertEquals (dti .is_year_end [0 ], False )
2241+ self .assertEquals (dti .is_year_end [364 ], True )
2242+
2243+ self .assertEquals (len (dti .year ), 365 )
2244+ self .assertEquals (len (dti .month ), 365 )
2245+ self .assertEquals (len (dti .day ), 365 )
2246+ self .assertEquals (len (dti .hour ), 365 )
2247+ self .assertEquals (len (dti .minute ), 365 )
2248+ self .assertEquals (len (dti .second ), 365 )
2249+ self .assertEquals (len (dti .microsecond ), 365 )
2250+ self .assertEquals (len (dti .dayofweek ), 365 )
2251+ self .assertEquals (len (dti .dayofyear ), 365 )
2252+ self .assertEquals (len (dti .weekofyear ), 365 )
2253+ self .assertEquals (len (dti .quarter ), 365 )
2254+ self .assertEquals (len (dti .is_month_start ), 365 )
2255+ self .assertEquals (len (dti .is_month_end ), 365 )
2256+ self .assertEquals (len (dti .is_quarter_start ), 365 )
2257+ self .assertEquals (len (dti .is_quarter_end ), 365 )
2258+ self .assertEquals (len (dti .is_year_start ), 365 )
2259+ self .assertEquals (len (dti .is_year_end ), 365 )
2260+
2261+ dti = DatetimeIndex (
2262+ freq = 'BQ-FEB' , start = datetime (1998 , 1 , 1 ), periods = 4 )
2263+
2264+ self .assertEquals (sum (dti .is_quarter_start ), 0 )
2265+ self .assertEquals (sum (dti .is_quarter_end ), 4 )
2266+ self .assertEquals (sum (dti .is_year_start ), 0 )
2267+ self .assertEquals (sum (dti .is_year_end ), 1 )
2268+
2269+ # Ensure is_start/end accessors throw ValueError for CustomBusinessDay, CBD requires np >= 1.7
2270+ if not _np_version_under1p7 :
2271+ bday_egypt = offsets .CustomBusinessDay (weekmask = 'Sun Mon Tue Wed Thu' )
2272+ dti = date_range (datetime (2013 , 4 , 30 ), periods = 5 , freq = bday_egypt )
2273+ self .assertRaises (ValueError , lambda : dti .is_month_start )
2274+
2275+ dti = DatetimeIndex (['2000-01-01' , '2000-01-02' , '2000-01-03' ])
2276+
2277+ self .assertEquals (dti .is_month_start [0 ], 1 )
2278+
2279+ tests = [
2280+ (Timestamp ('2013-06-01' , offset = 'M' ).is_month_start , 1 ),
2281+ (Timestamp ('2013-06-01' , offset = 'BM' ).is_month_start , 0 ),
2282+ (Timestamp ('2013-06-03' , offset = 'M' ).is_month_start , 0 ),
2283+ (Timestamp ('2013-06-03' , offset = 'BM' ).is_month_start , 1 ),
2284+ (Timestamp ('2013-02-28' , offset = 'Q-FEB' ).is_month_end , 1 ),
2285+ (Timestamp ('2013-02-28' , offset = 'Q-FEB' ).is_quarter_end , 1 ),
2286+ (Timestamp ('2013-02-28' , offset = 'Q-FEB' ).is_year_end , 1 ),
2287+ (Timestamp ('2013-03-01' , offset = 'Q-FEB' ).is_month_start , 1 ),
2288+ (Timestamp ('2013-03-01' , offset = 'Q-FEB' ).is_quarter_start , 1 ),
2289+ (Timestamp ('2013-03-01' , offset = 'Q-FEB' ).is_year_start , 1 ),
2290+ (Timestamp ('2013-03-31' , offset = 'QS-FEB' ).is_month_end , 1 ),
2291+ (Timestamp ('2013-03-31' , offset = 'QS-FEB' ).is_quarter_end , 0 ),
2292+ (Timestamp ('2013-03-31' , offset = 'QS-FEB' ).is_year_end , 0 ),
2293+ (Timestamp ('2013-02-01' , offset = 'QS-FEB' ).is_month_start , 1 ),
2294+ (Timestamp ('2013-02-01' , offset = 'QS-FEB' ).is_quarter_start , 1 ),
2295+ (Timestamp ('2013-02-01' , offset = 'QS-FEB' ).is_year_start , 1 ),
2296+ (Timestamp ('2013-06-30' , offset = 'BQ' ).is_month_end , 0 ),
2297+ (Timestamp ('2013-06-30' , offset = 'BQ' ).is_quarter_end , 0 ),
2298+ (Timestamp ('2013-06-30' , offset = 'BQ' ).is_year_end , 0 ),
2299+ (Timestamp ('2013-06-28' , offset = 'BQ' ).is_month_end , 1 ),
2300+ (Timestamp ('2013-06-28' , offset = 'BQ' ).is_quarter_end , 1 ),
2301+ (Timestamp ('2013-06-28' , offset = 'BQ' ).is_year_end , 0 ),
2302+ (Timestamp ('2013-06-30' , offset = 'BQS-APR' ).is_month_end , 0 ),
2303+ (Timestamp ('2013-06-30' , offset = 'BQS-APR' ).is_quarter_end , 0 ),
2304+ (Timestamp ('2013-06-30' , offset = 'BQS-APR' ).is_year_end , 0 ),
2305+ (Timestamp ('2013-06-28' , offset = 'BQS-APR' ).is_month_end , 1 ),
2306+ (Timestamp ('2013-06-28' , offset = 'BQS-APR' ).is_quarter_end , 1 ),
2307+ (Timestamp ('2013-03-29' , offset = 'BQS-APR' ).is_year_end , 1 ),
2308+ (Timestamp ('2013-11-01' , offset = 'AS-NOV' ).is_year_start , 1 ),
2309+ (Timestamp ('2013-10-31' , offset = 'AS-NOV' ).is_year_end , 1 )]
2310+
2311+ for ts , value in tests :
2312+ self .assertEquals (ts , value )
2313+
22362314
22372315 def test_nanosecond_field (self ):
22382316 dti = DatetimeIndex (np .arange (10 ))
0 commit comments