@@ -233,12 +233,22 @@ def _make_time_bins(axis, freq, begin=None, end=None,
233
233
return binner , bins , labels
234
234
235
235
def _get_range_edges (axis , begin , end , offset , closed = 'left' ):
236
+ from pandas .tseries .offsets import Tick , _delta_to_microseconds
236
237
if isinstance (offset , basestring ):
237
238
offset = to_offset (offset )
238
239
239
240
if not isinstance (offset , DateOffset ):
240
241
raise ValueError ("Rule not a recognized offset" )
241
242
243
+ if isinstance (offset , Tick ):
244
+ day_micros = _delta_to_microseconds (timedelta (1 ))
245
+ # #1165
246
+ if ((day_micros % offset .micros ) == 0 and begin is None
247
+ and end is None ):
248
+ return _adjust_dates_anchored (axis [0 ], axis [- 1 ], offset ,
249
+ closed = closed )
250
+
251
+
242
252
if begin is None :
243
253
if closed == 'left' :
244
254
first = Timestamp (offset .rollback (axis [0 ]))
@@ -255,6 +265,45 @@ def _get_range_edges(axis, begin, end, offset, closed='left'):
255
265
256
266
return first , last
257
267
268
+
269
+ def _adjust_dates_anchored (first , last , offset , closed = 'right' ):
270
+ from pandas .tseries .tools import normalize_date
271
+
272
+ start_day_micros = Timestamp (normalize_date (first )).value
273
+ last_day_micros = Timestamp (normalize_date (last )).value
274
+
275
+ foffset = (first .value - start_day_micros ) % offset .micros
276
+ loffset = (last .value - last_day_micros ) % offset .micros
277
+
278
+ if closed == 'right' :
279
+ if foffset > 0 :
280
+ # roll back
281
+ fresult = first .value - foffset
282
+ else :
283
+ fresult = first .value - offset .micros
284
+
285
+ if loffset > 0 :
286
+ # roll forward
287
+ lresult = last .value + (offset .micros - loffset )
288
+ else :
289
+ # already the end of the road
290
+ lresult = last .value
291
+ else : # closed == 'left'
292
+ if foffset > 0 :
293
+ fresult = first .value - foffset
294
+ else :
295
+ # start of the road
296
+ fresult = first .value
297
+
298
+ if loffset > 0 :
299
+ # roll forward
300
+ lresult = last .value + (offset .micros - loffset )
301
+ else :
302
+ lresult = last .value + offset .micros
303
+
304
+ return Timestamp (fresult ), Timestamp (lresult )
305
+
306
+
258
307
def asfreq (obj , freq , method = None , how = None ):
259
308
"""
260
309
Utility frequency conversion method for Series/DataFrame
0 commit comments