@@ -115,6 +115,9 @@ class DatetimeIndex(Int64Index):
115
115
end : end time, datetime-like, optional
116
116
If periods is none, generated index will extend to first conforming
117
117
time on or just past end argument
118
+ closed : string or None, default None
119
+ Make the interval closed with respect to the given frequency to
120
+ the 'left', 'right', or both sides (None)
118
121
"""
119
122
_join_precedence = 10
120
123
@@ -143,7 +146,8 @@ class DatetimeIndex(Int64Index):
143
146
def __new__ (cls , data = None ,
144
147
freq = None , start = None , end = None , periods = None ,
145
148
copy = False , name = None , tz = None ,
146
- verify_integrity = True , normalize = False , ** kwds ):
149
+ verify_integrity = True , normalize = False ,
150
+ closed = None , ** kwds ):
147
151
148
152
dayfirst = kwds .pop ('dayfirst' , None )
149
153
yearfirst = kwds .pop ('yearfirst' , None )
@@ -184,7 +188,7 @@ def __new__(cls, data=None,
184
188
185
189
if data is None :
186
190
return cls ._generate (start , end , periods , name , offset ,
187
- tz = tz , normalize = normalize ,
191
+ tz = tz , normalize = normalize , closed = closed ,
188
192
infer_dst = infer_dst )
189
193
190
194
if not isinstance (data , np .ndarray ):
@@ -289,7 +293,7 @@ def __new__(cls, data=None,
289
293
290
294
@classmethod
291
295
def _generate (cls , start , end , periods , name , offset ,
292
- tz = None , normalize = False , infer_dst = False ):
296
+ tz = None , normalize = False , infer_dst = False , closed = None ):
293
297
if com ._count_not_none (start , end , periods ) != 2 :
294
298
raise ValueError ('Must specify two of start, end, or periods' )
295
299
@@ -301,6 +305,24 @@ def _generate(cls, start, end, periods, name, offset,
301
305
if end is not None :
302
306
end = Timestamp (end )
303
307
308
+ left_closed = False
309
+ right_closed = False
310
+
311
+ if start is None and end is None :
312
+ if closed is not None :
313
+ raise ValueError ("Closed has to be None if not both of start"
314
+ "and end are defined" )
315
+
316
+ if closed is None :
317
+ left_closed = True
318
+ right_closed = True
319
+ elif closed == "left" :
320
+ left_closed = True
321
+ elif closed == "right" :
322
+ right_closed = True
323
+ else :
324
+ raise ValueError ("Closed has to be either 'left', 'right' or None" )
325
+
304
326
try :
305
327
inferred_tz = tools ._infer_tzinfo (start , end )
306
328
except :
@@ -387,6 +409,11 @@ def _generate(cls, start, end, periods, name, offset,
387
409
index .offset = offset
388
410
index .tz = tz
389
411
412
+ if not left_closed :
413
+ index = index [1 :]
414
+ if not right_closed :
415
+ index = index [:- 1 ]
416
+
390
417
return index
391
418
392
419
def _box_values (self , values ):
@@ -1715,7 +1742,7 @@ def _generate_regular_range(start, end, periods, offset):
1715
1742
1716
1743
1717
1744
def date_range (start = None , end = None , periods = None , freq = 'D' , tz = None ,
1718
- normalize = False , name = None ):
1745
+ normalize = False , name = None , closed = None ):
1719
1746
"""
1720
1747
Return a fixed frequency datetime index, with day (calendar) as the default
1721
1748
frequency
@@ -1737,6 +1764,9 @@ def date_range(start=None, end=None, periods=None, freq='D', tz=None,
1737
1764
Normalize start/end dates to midnight before generating date range
1738
1765
name : str, default None
1739
1766
Name of the resulting index
1767
+ closed : string or None, default None
1768
+ Make the interval closed with respect to the given frequency to
1769
+ the 'left', 'right', or both sides (None)
1740
1770
1741
1771
Notes
1742
1772
-----
@@ -1747,11 +1777,12 @@ def date_range(start=None, end=None, periods=None, freq='D', tz=None,
1747
1777
rng : DatetimeIndex
1748
1778
"""
1749
1779
return DatetimeIndex (start = start , end = end , periods = periods ,
1750
- freq = freq , tz = tz , normalize = normalize , name = name )
1780
+ freq = freq , tz = tz , normalize = normalize , name = name ,
1781
+ closed = closed )
1751
1782
1752
1783
1753
1784
def bdate_range (start = None , end = None , periods = None , freq = 'B' , tz = None ,
1754
- normalize = True , name = None ):
1785
+ normalize = True , name = None , closed = None ):
1755
1786
"""
1756
1787
Return a fixed frequency datetime index, with business day as the default
1757
1788
frequency
@@ -1773,6 +1804,9 @@ def bdate_range(start=None, end=None, periods=None, freq='B', tz=None,
1773
1804
Normalize start/end dates to midnight before generating date range
1774
1805
name : str, default None
1775
1806
Name for the resulting index
1807
+ closed : string or None, default None
1808
+ Make the interval closed with respect to the given frequency to
1809
+ the 'left', 'right', or both sides (None)
1776
1810
1777
1811
Notes
1778
1812
-----
@@ -1784,11 +1818,12 @@ def bdate_range(start=None, end=None, periods=None, freq='B', tz=None,
1784
1818
"""
1785
1819
1786
1820
return DatetimeIndex (start = start , end = end , periods = periods ,
1787
- freq = freq , tz = tz , normalize = normalize , name = name )
1821
+ freq = freq , tz = tz , normalize = normalize , name = name ,
1822
+ closed = closed )
1788
1823
1789
1824
1790
1825
def cdate_range (start = None , end = None , periods = None , freq = 'C' , tz = None ,
1791
- normalize = True , name = None , ** kwargs ):
1826
+ normalize = True , name = None , closed = None , ** kwargs ):
1792
1827
"""
1793
1828
**EXPERIMENTAL** Return a fixed frequency datetime index, with
1794
1829
CustomBusinessDay as the default frequency
@@ -1820,6 +1855,9 @@ def cdate_range(start=None, end=None, periods=None, freq='C', tz=None,
1820
1855
holidays : list
1821
1856
list/array of dates to exclude from the set of valid business days,
1822
1857
passed to ``numpy.busdaycalendar``
1858
+ closed : string or None, default None
1859
+ Make the interval closed with respect to the given frequency to
1860
+ the 'left', 'right', or both sides (None)
1823
1861
1824
1862
Notes
1825
1863
-----
@@ -1835,7 +1873,8 @@ def cdate_range(start=None, end=None, periods=None, freq='C', tz=None,
1835
1873
weekmask = kwargs .pop ('weekmask' , 'Mon Tue Wed Thu Fri' )
1836
1874
freq = CDay (holidays = holidays , weekmask = weekmask )
1837
1875
return DatetimeIndex (start = start , end = end , periods = periods , freq = freq ,
1838
- tz = tz , normalize = normalize , name = name , ** kwargs )
1876
+ tz = tz , normalize = normalize , name = name ,
1877
+ closed = closed , ** kwargs )
1839
1878
1840
1879
1841
1880
def _to_m8 (key , tz = None ):
0 commit comments