Skip to content

Commit 6c44257

Browse files
committed
CLN: clean timedelta_range and date_range
1 parent d0d03b4 commit 6c44257

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
@@ -45,11 +45,11 @@
4545

4646
from pandas.core.algorithms import checked_add_with_arr
4747
from pandas.core.arrays import datetimelike as dtl
48-
from pandas.core.arrays._ranges import generate_timestamps_range
48+
from pandas.core.arrays._ranges import generate_regular_range
4949
import pandas.core.common as com
5050

5151
from pandas.tseries.frequencies import get_period_alias, to_offset
52-
from pandas.tseries.offsets import Day, Tick
52+
from pandas.tseries.offsets import Day, Tick, generate_range
5353

5454
_midnight = time(0, 0)
5555

@@ -367,33 +367,22 @@ def _generate_range(
367367
if end is not None:
368368
end = Timestamp(end)
369369

370-
if start is None and end is None:
371-
if closed is not None:
372-
raise ValueError(
373-
"Closed has to be None if not both of start and end are defined"
374-
)
375370
if start is NaT or end is NaT:
376371
raise ValueError("Neither `start` nor `end` can be NaT")
377372

378373
left_closed, right_closed = dtl.validate_endpoints(closed)
379-
380374
start, end, _normalized = _maybe_normalize_endpoints(start, end, normalize)
381-
382375
tz = _infer_tz_from_endpoints(start, end, tz)
383376

384377
if tz is not None:
385378
# Localize the start and end arguments
379+
start_tz = None if start is None else start.tz
380+
end_tz = None if end is None else end.tz
386381
start = _maybe_localize_point(
387-
start,
388-
getattr(start, "tz", None),
389-
start,
390-
freq,
391-
tz,
392-
ambiguous,
393-
nonexistent,
382+
start, start_tz, start, freq, tz, ambiguous, nonexistent
394383
)
395384
end = _maybe_localize_point(
396-
end, getattr(end, "tz", None), end, freq, tz, ambiguous, nonexistent
385+
end, end_tz, end, freq, tz, ambiguous, nonexistent
397386
)
398387
if freq is not None:
399388
# We break Day arithmetic (fixed 24 hour) here and opt for
@@ -405,7 +394,13 @@ def _generate_range(
405394
if end is not None:
406395
end = end.tz_localize(None)
407396

408-
values, _tz = generate_timestamps_range(start, end, periods, freq)
397+
if isinstance(freq, Tick):
398+
values = generate_regular_range(start, end, periods, freq)
399+
else:
400+
xdr = generate_range(start=start, end=end, periods=periods, offset=freq)
401+
values = np.array([x.value for x in xdr], dtype=np.int64)
402+
403+
_tz = start.tz if start is not None else end.tz
409404
index = cls._simple_new(values, freq=freq, dtype=tz_to_dtype(_tz))
410405

411406
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
@@ -38,7 +38,7 @@
3838
from pandas.core import nanops
3939
from pandas.core.algorithms import checked_add_with_arr
4040
from pandas.core.arrays import datetimelike as dtl
41-
from pandas.core.arrays._ranges import generate_timedeltas_range
41+
from pandas.core.arrays._ranges import generate_regular_range
4242
import pandas.core.common as com
4343
from pandas.core.construction import extract_array
4444

@@ -247,16 +247,10 @@ def _generate_range(cls, start, end, periods, freq, closed=None):
247247
if end is not None:
248248
end = Timedelta(end)
249249

250-
if start is None and end is None:
251-
if closed is not None:
252-
raise ValueError(
253-
"Closed has to be None if not both of startand end are defined"
254-
)
255-
256250
left_closed, right_closed = dtl.validate_endpoints(closed)
257251

258252
if freq is not None:
259-
index = generate_timedeltas_range(start, end, periods, freq)
253+
index = generate_regular_range(start, end, periods, freq)
260254
else:
261255
index = np.linspace(start.value, end.value, periods).astype("i8")
262256
if len(index) >= 2:

0 commit comments

Comments
 (0)