@@ -116,6 +116,9 @@ class DatetimeIndex(Int64Index):
116
116
end : end time, datetime-like, optional
117
117
If periods is none, generated index will extend to first conforming
118
118
time on or just past end argument
119
+ closed : string or None, default None
120
+ Make the interval closed with respect to the given frequency to
121
+ the 'left', 'right', or both sides (None)
119
122
"""
120
123
_join_precedence = 10
121
124
@@ -144,7 +147,8 @@ class DatetimeIndex(Int64Index):
144
147
def __new__ (cls , data = None ,
145
148
freq = None , start = None , end = None , periods = None ,
146
149
copy = False , name = None , tz = None ,
147
- verify_integrity = True , normalize = False , ** kwds ):
150
+ verify_integrity = True , normalize = False ,
151
+ closed = None , ** kwds ):
148
152
149
153
dayfirst = kwds .pop ('dayfirst' , None )
150
154
yearfirst = kwds .pop ('yearfirst' , None )
@@ -185,7 +189,7 @@ def __new__(cls, data=None,
185
189
186
190
if data is None :
187
191
return cls ._generate (start , end , periods , name , offset ,
188
- tz = tz , normalize = normalize ,
192
+ tz = tz , normalize = normalize , closed = closed ,
189
193
infer_dst = infer_dst )
190
194
191
195
if not isinstance (data , np .ndarray ):
@@ -290,7 +294,7 @@ def __new__(cls, data=None,
290
294
291
295
@classmethod
292
296
def _generate (cls , start , end , periods , name , offset ,
293
- tz = None , normalize = False , infer_dst = False ):
297
+ tz = None , normalize = False , infer_dst = False , closed = None ):
294
298
if com ._count_not_none (start , end , periods ) != 2 :
295
299
raise ValueError ('Must specify two of start, end, or periods' )
296
300
@@ -302,6 +306,24 @@ def _generate(cls, start, end, periods, name, offset,
302
306
if end is not None :
303
307
end = Timestamp (end )
304
308
309
+ left_closed = False
310
+ right_closed = False
311
+
312
+ if start is None and end is None :
313
+ if closed is not None :
314
+ raise ValueError ("Closed has to be None if not both of start"
315
+ "and end are defined" )
316
+
317
+ if closed is None :
318
+ left_closed = True
319
+ right_closed = True
320
+ elif closed == "left" :
321
+ left_closed = True
322
+ elif closed == "right" :
323
+ right_closed = True
324
+ else :
325
+ raise ValueError ("Closed has to be either 'left', 'right' or None" )
326
+
305
327
try :
306
328
inferred_tz = tools ._infer_tzinfo (start , end )
307
329
except :
@@ -388,6 +410,11 @@ def _generate(cls, start, end, periods, name, offset,
388
410
index .offset = offset
389
411
index .tz = tz
390
412
413
+ if not left_closed :
414
+ index = index [1 :]
415
+ if not right_closed :
416
+ index = index [:- 1 ]
417
+
391
418
return index
392
419
393
420
def _box_values (self , values ):
@@ -1722,7 +1749,7 @@ def _generate_regular_range(start, end, periods, offset):
1722
1749
1723
1750
1724
1751
def date_range (start = None , end = None , periods = None , freq = 'D' , tz = None ,
1725
- normalize = False , name = None ):
1752
+ normalize = False , name = None , closed = None ):
1726
1753
"""
1727
1754
Return a fixed frequency datetime index, with day (calendar) as the default
1728
1755
frequency
@@ -1744,6 +1771,9 @@ def date_range(start=None, end=None, periods=None, freq='D', tz=None,
1744
1771
Normalize start/end dates to midnight before generating date range
1745
1772
name : str, default None
1746
1773
Name of the resulting index
1774
+ closed : string or None, default None
1775
+ Make the interval closed with respect to the given frequency to
1776
+ the 'left', 'right', or both sides (None)
1747
1777
1748
1778
Notes
1749
1779
-----
@@ -1754,11 +1784,12 @@ def date_range(start=None, end=None, periods=None, freq='D', tz=None,
1754
1784
rng : DatetimeIndex
1755
1785
"""
1756
1786
return DatetimeIndex (start = start , end = end , periods = periods ,
1757
- freq = freq , tz = tz , normalize = normalize , name = name )
1787
+ freq = freq , tz = tz , normalize = normalize , name = name ,
1788
+ closed = closed )
1758
1789
1759
1790
1760
1791
def bdate_range (start = None , end = None , periods = None , freq = 'B' , tz = None ,
1761
- normalize = True , name = None ):
1792
+ normalize = True , name = None , closed = None ):
1762
1793
"""
1763
1794
Return a fixed frequency datetime index, with business day as the default
1764
1795
frequency
@@ -1780,6 +1811,9 @@ def bdate_range(start=None, end=None, periods=None, freq='B', tz=None,
1780
1811
Normalize start/end dates to midnight before generating date range
1781
1812
name : str, default None
1782
1813
Name for the resulting index
1814
+ closed : string or None, default None
1815
+ Make the interval closed with respect to the given frequency to
1816
+ the 'left', 'right', or both sides (None)
1783
1817
1784
1818
Notes
1785
1819
-----
@@ -1791,11 +1825,12 @@ def bdate_range(start=None, end=None, periods=None, freq='B', tz=None,
1791
1825
"""
1792
1826
1793
1827
return DatetimeIndex (start = start , end = end , periods = periods ,
1794
- freq = freq , tz = tz , normalize = normalize , name = name )
1828
+ freq = freq , tz = tz , normalize = normalize , name = name ,
1829
+ closed = closed )
1795
1830
1796
1831
1797
1832
def cdate_range (start = None , end = None , periods = None , freq = 'C' , tz = None ,
1798
- normalize = True , name = None , ** kwargs ):
1833
+ normalize = True , name = None , closed = None , ** kwargs ):
1799
1834
"""
1800
1835
**EXPERIMENTAL** Return a fixed frequency datetime index, with
1801
1836
CustomBusinessDay as the default frequency
@@ -1827,6 +1862,9 @@ def cdate_range(start=None, end=None, periods=None, freq='C', tz=None,
1827
1862
holidays : list
1828
1863
list/array of dates to exclude from the set of valid business days,
1829
1864
passed to ``numpy.busdaycalendar``
1865
+ closed : string or None, default None
1866
+ Make the interval closed with respect to the given frequency to
1867
+ the 'left', 'right', or both sides (None)
1830
1868
1831
1869
Notes
1832
1870
-----
@@ -1842,7 +1880,8 @@ def cdate_range(start=None, end=None, periods=None, freq='C', tz=None,
1842
1880
weekmask = kwargs .pop ('weekmask' , 'Mon Tue Wed Thu Fri' )
1843
1881
freq = CDay (holidays = holidays , weekmask = weekmask )
1844
1882
return DatetimeIndex (start = start , end = end , periods = periods , freq = freq ,
1845
- tz = tz , normalize = normalize , name = name , ** kwargs )
1883
+ tz = tz , normalize = normalize , name = name ,
1884
+ closed = closed , ** kwargs )
1846
1885
1847
1886
1848
1887
def _to_m8 (key , tz = None ):
0 commit comments