@@ -1698,13 +1698,9 @@ def _generate_regular_range(cls, start, end, periods, freq):
1698
1698
e = _generate_range_overflow_safe (b , periods , stride , side = 'start' )
1699
1699
tz = start .tz
1700
1700
elif end is not None :
1701
- e = Timestamp (end ).value
1701
+ e = Timestamp (end ).value + stride
1702
1702
b = _generate_range_overflow_safe (e , periods , stride , side = 'end' )
1703
1703
tz = end .tz
1704
-
1705
- # add an additional step to `e` because np.arange(b, e) will
1706
- # not include `e`
1707
- e += stride
1708
1704
else :
1709
1705
raise ValueError ("at least 'start' or 'end' should be specified "
1710
1706
"if a 'period' is given." )
@@ -1753,10 +1749,10 @@ def _generate_range_overflow_safe(endpoint, periods, stride,
1753
1749
# GH#14187 raise instead of incorrectly wrapping around
1754
1750
assert side in ['start' , 'end' ]
1755
1751
1756
- i64max = np .iinfo (np .int64 ).max
1752
+ i64max = np .uint64 ( np . iinfo (np .int64 ).max )
1757
1753
msg = ('Cannot generate range with {side}={endpoint} and '
1758
1754
'periods={periods}'
1759
- .format (side = side , endpoint = Timestamp ( endpoint ) , periods = periods ))
1755
+ .format (side = side , endpoint = endpoint , periods = periods ))
1760
1756
1761
1757
with np .errstate (over = "raise" ):
1762
1758
# if periods * strides cannot be multiplied within the *uint64* bounds,
@@ -1776,6 +1772,12 @@ def _generate_range_overflow_safe(endpoint, periods, stride,
1776
1772
# no chance of not-overflowing
1777
1773
raise tslib .OutOfBoundsDatetime (msg )
1778
1774
1775
+ elif (side == 'end' and endpoint > i64max and endpoint - stride <= i64max ):
1776
+ # in _generate_regular_range we added `stride` thereby overflowing
1777
+ # the bounds. Adjust to fix this.
1778
+ return _generate_range_overflow_safe (endpoint - stride ,
1779
+ periods - 1 , stride , side )
1780
+
1779
1781
# split into smaller pieces
1780
1782
return _generate_range_recurse (endpoint , periods , stride , side )
1781
1783
0 commit comments