Skip to content

Commit 6208bcb

Browse files
committed
CLN: clean timedelta_range and date_range
1 parent fffb57c commit 6208bcb

File tree

3 files changed

+31
-77
lines changed

3 files changed

+31
-77
lines changed

pandas/core/arrays/_ranges.py

Lines changed: 16 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -3,64 +3,30 @@
33
(and possibly TimedeltaArray/PeriodArray)
44
"""
55

6-
from typing import Tuple
6+
from typing import Union
77

88
import numpy as np
99

1010
from pandas._libs.tslibs import OutOfBoundsDatetime, Timedelta, Timestamp
1111

12-
from pandas.tseries.offsets import DateOffset, Tick, generate_range
12+
from pandas.tseries.offsets import DateOffset
1313

1414

15-
def generate_timestamps_range(
16-
start: Timestamp, end: Timestamp, periods: int, freq: DateOffset
17-
) -> Tuple[np.ndarray, str]:
18-
"""
19-
Generate a range of dates with the spans between dates described by
20-
the given `freq` DateOffset.
21-
22-
Parameters
23-
----------
24-
start : Timestamp or None
25-
first point of produced date range
26-
end : Timestamp or None
27-
last point of produced date range
28-
periods : int
29-
number of periods in produced date range
30-
freq : DateOffset
31-
describes space between dates in produced date range
32-
33-
Returns
34-
-------
35-
(tuple): containing:
36-
37-
values : ndarray[np.int64] representing nanosecond unix timestamps
38-
tz : the timezone of the range
39-
"""
40-
if isinstance(freq, Tick):
41-
start_value = Timestamp(start).value if start is not None else None
42-
end_value = Timestamp(end).value if end is not None else None
43-
values = _generate_regular_range(start_value, end_value, periods, freq.nanos)
44-
else:
45-
xdr = generate_range(start=start, end=end, periods=periods, offset=freq)
46-
values = np.array([x.value for x in xdr], dtype=np.int64)
47-
48-
tz = start.tz if start is not None else end.tz
49-
return values, tz
50-
51-
52-
def generate_timedeltas_range(
53-
start: Timedelta, end: Timedelta, periods: int, freq: DateOffset
15+
def generate_regular_range(
16+
start: Union[Timestamp, Timedelta],
17+
end: Union[Timestamp, Timedelta],
18+
periods: int,
19+
freq: DateOffset,
5420
):
5521
"""
56-
Generate a range of dates with the spans between dates described by
57-
the given `freq` DateOffset.
22+
Generate a range of dates or timestamps with the spans between dates
23+
described by the given `freq` DateOffset.
5824
5925
Parameters
6026
----------
61-
start : Timedelta or None
27+
start : Timedelta, Timestamp or None
6228
first point of produced date range
63-
end : Timedelta or None
29+
start : Timedelta, Timestamp or None
6430
last point of produced date range
6531
periods : int
6632
number of periods in produced date range
@@ -69,14 +35,13 @@ def generate_timedeltas_range(
6935
7036
Returns
7137
-------
72-
ndarray[np.int64] representing nanosecond timedeltas
38+
ndarray[np.int64]
39+
Representing nanosecond unix timestamps.
7340
"""
74-
start_value = Timedelta(start).value if start is not None else None
75-
end_value = Timedelta(end).value if end is not None else None
76-
return _generate_regular_range(start_value, end_value, periods, freq.nanos)
77-
41+
start = start.value if start is not None else None
42+
end = end.value if end is not None else None
43+
stride = freq.nanos
7844

79-
def _generate_regular_range(start: int, end: int, periods: int, stride: int):
8045
b = start
8146
if periods is None:
8247
# cannot just use e = Timestamp(end) + 1 because arange breaks when

pandas/core/arrays/datetimes.py

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,11 @@
4444

4545
from pandas.core.algorithms import checked_add_with_arr
4646
from pandas.core.arrays import datetimelike as dtl
47-
from pandas.core.arrays._ranges import generate_timestamps_range
47+
from pandas.core.arrays._ranges import generate_regular_range
4848
import pandas.core.common as com
4949

5050
from pandas.tseries.frequencies import get_period_alias, to_offset
51-
from pandas.tseries.offsets import Day, Tick
51+
from pandas.tseries.offsets import Day, Tick, generate_range
5252

5353
_midnight = time(0, 0)
5454

@@ -370,33 +370,22 @@ def _generate_range(
370370
if end is not None:
371371
end = Timestamp(end)
372372

373-
if start is None and end is None:
374-
if closed is not None:
375-
raise ValueError(
376-
"Closed has to be None if not both of start and end are defined"
377-
)
378373
if start is NaT or end is NaT:
379374
raise ValueError("Neither `start` nor `end` can be NaT")
380375

381376
left_closed, right_closed = dtl.validate_endpoints(closed)
382-
383377
start, end, _normalized = _maybe_normalize_endpoints(start, end, normalize)
384-
385378
tz = _infer_tz_from_endpoints(start, end, tz)
386379

387380
if tz is not None:
388381
# Localize the start and end arguments
382+
start_tz = None if start is None else start.tz
383+
end_tz = None if end is None else end.tz
389384
start = _maybe_localize_point(
390-
start,
391-
getattr(start, "tz", None),
392-
start,
393-
freq,
394-
tz,
395-
ambiguous,
396-
nonexistent,
385+
start, start_tz, start, freq, tz, ambiguous, nonexistent
397386
)
398387
end = _maybe_localize_point(
399-
end, getattr(end, "tz", None), end, freq, tz, ambiguous, nonexistent
388+
end, end_tz, end, freq, tz, ambiguous, nonexistent
400389
)
401390
if freq is not None:
402391
# We break Day arithmetic (fixed 24 hour) here and opt for
@@ -408,7 +397,13 @@ def _generate_range(
408397
if end is not None:
409398
end = end.tz_localize(None)
410399

411-
values, _tz = generate_timestamps_range(start, end, periods, freq)
400+
if isinstance(freq, Tick):
401+
values = generate_regular_range(start, end, periods, freq)
402+
else:
403+
xdr = generate_range(start=start, end=end, periods=periods, offset=freq)
404+
values = np.array([x.value for x in xdr], dtype=np.int64)
405+
406+
_tz = start.tz if start is not None else end.tz
412407
index = cls._simple_new(values, freq=freq, dtype=tz_to_dtype(_tz))
413408

414409
if tz is not None and index.tz is None:

pandas/core/arrays/timedeltas.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
from pandas.core import nanops
3434
from pandas.core.algorithms import checked_add_with_arr
3535
from pandas.core.arrays import datetimelike as dtl
36-
from pandas.core.arrays._ranges import generate_timedeltas_range
36+
from pandas.core.arrays._ranges import generate_regular_range
3737
import pandas.core.common as com
3838
from pandas.core.construction import extract_array
3939
from pandas.core.ops.common import unpack_zerodim_and_defer
@@ -256,16 +256,10 @@ def _generate_range(cls, start, end, periods, freq, closed=None):
256256
if end is not None:
257257
end = Timedelta(end)
258258

259-
if start is None and end is None:
260-
if closed is not None:
261-
raise ValueError(
262-
"Closed has to be None if not both of start and end are defined"
263-
)
264-
265259
left_closed, right_closed = dtl.validate_endpoints(closed)
266260

267261
if freq is not None:
268-
index = generate_timedeltas_range(start, end, periods, freq)
262+
index = generate_regular_range(start, end, periods, freq)
269263
else:
270264
index = np.linspace(start.value, end.value, periods).astype("i8")
271265
if len(index) >= 2:

0 commit comments

Comments
 (0)