Skip to content

Commit df7376e

Browse files
committed
update expecteds
1 parent 257f410 commit df7376e

File tree

8 files changed

+47
-28
lines changed

8 files changed

+47
-28
lines changed

pandas/core/indexes/datetimes.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@
2626
to_offset,
2727
)
2828
from pandas._libs.tslibs.dtypes import abbrev_to_npy_unit
29-
from pandas._libs.tslibs.offsets import prefix_mapping
29+
from pandas._libs.tslibs.offsets import (
30+
DateOffset,
31+
prefix_mapping,
32+
)
3033
from pandas.errors import Pandas4Warning
3134
from pandas.util._decorators import (
3235
cache_readonly,
@@ -1064,6 +1067,12 @@ def date_range(
10641067
"""
10651068
if freq is None and com.any_none(periods, start, end):
10661069
freq = "D"
1070+
if freq is not None:
1071+
freq = to_offset(freq)
1072+
1073+
if start is NaT or end is NaT:
1074+
# This check needs to come before the `unit = start.unit` line below
1075+
raise ValueError("Neither `start` nor `end` can be NaT")
10671076

10681077
if unit is None:
10691078
# Infer the unit based on the inputs
@@ -1078,14 +1087,18 @@ def date_range(
10781087
elif start is not None:
10791088
start = Timestamp(start)
10801089
unit = start.unit
1081-
else:
1090+
elif end is not None:
10821091
end = Timestamp(end)
10831092
unit = end.unit
1093+
else:
1094+
raise ValueError(
1095+
"Of the four parameters: start, end, periods, "
1096+
"and freq, exactly three must be specified"
1097+
)
10841098

10851099
# Last we need to watch out for cases where the 'freq' implies a higher
10861100
# unit than either start or end
10871101
if freq is not None:
1088-
freq = to_offset(freq)
10891102
creso = abbrev_to_npy_unit(unit)
10901103
if isinstance(freq, Tick):
10911104
if freq._creso > creso:
@@ -1095,6 +1108,9 @@ def date_range(
10951108
td = Timedelta(freq.offset)
10961109
if abbrev_to_npy_unit(td.unit) > creso:
10971110
unit = td.unit
1111+
elif type(freq) is DateOffset and getattr(freq, "nanoseconds", 0) != 0:
1112+
# e.g. test_freq_dateoffset_with_relateivedelta_nanos
1113+
unit = "ns"
10981114

10991115
dtarr = DatetimeArray._generate_range(
11001116
start=start,

pandas/tests/indexes/datetimes/test_date_range.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -242,11 +242,11 @@ def test_date_range_int64_overflow_non_recoverable(self):
242242
# case with start later than 1970-01-01, overflow int64 but not uint64
243243
msg = "Cannot generate range with"
244244
with pytest.raises(OutOfBoundsDatetime, match=msg):
245-
date_range(start="1970-02-01", periods=106752 * 24, freq="h")
245+
date_range(start="1970-02-01", periods=106752 * 24, freq="h", unit="ns")
246246

247247
# case with end before 1970-01-01, overflow int64 but not uint64
248248
with pytest.raises(OutOfBoundsDatetime, match=msg):
249-
date_range(end="1969-11-14", periods=106752 * 24, freq="h")
249+
date_range(end="1969-11-14", periods=106752 * 24, freq="h", unit="ns")
250250

251251
@pytest.mark.slow
252252
@pytest.mark.parametrize(
@@ -271,9 +271,9 @@ def test_date_range_out_of_bounds(self):
271271
# GH#14187
272272
msg = "Cannot generate range"
273273
with pytest.raises(OutOfBoundsDatetime, match=msg):
274-
date_range("2016-01-01", periods=100000, freq="D")
274+
date_range("2016-01-01", periods=100000, freq="D", unit="ns")
275275
with pytest.raises(OutOfBoundsDatetime, match=msg):
276-
date_range(end="1763-10-12", periods=100000, freq="D")
276+
date_range(end="1763-10-12", periods=100000, freq="D", unit="ns")
277277

278278
def test_date_range_gen_error(self):
279279
rng = date_range("1/1/2000 00:00", "1/1/2000 00:18", freq="5min")
@@ -287,7 +287,7 @@ def test_date_range_normalize(self):
287287

288288
offset = timedelta(2)
289289
expected = DatetimeIndex(
290-
[snap + i * offset for i in range(n)], dtype="M8[ns]", freq=offset
290+
[snap + i * offset for i in range(n)], dtype="M8[us]", freq=offset
291291
)
292292

293293
tm.assert_index_equal(rng, expected)
@@ -687,13 +687,13 @@ def test_freq_divides_end_in_nanos(self):
687687
result_2 = date_range("2005-01-13 10:00", "2005-01-13 16:00", freq="345min")
688688
expected_1 = DatetimeIndex(
689689
["2005-01-12 10:00:00", "2005-01-12 15:45:00"],
690-
dtype="datetime64[ns]",
690+
dtype="datetime64[us]",
691691
freq="345min",
692692
tz=None,
693693
)
694694
expected_2 = DatetimeIndex(
695695
["2005-01-13 10:00:00", "2005-01-13 15:45:00"],
696-
dtype="datetime64[ns]",
696+
dtype="datetime64[us]",
697697
freq="345min",
698698
tz=None,
699699
)
@@ -1014,10 +1014,10 @@ def test_precision_finer_than_offset(self):
10141014
"2015-06-21 00:00:03",
10151015
]
10161016
expected1 = DatetimeIndex(
1017-
expected1_list, dtype="datetime64[ns]", freq="QE-DEC", tz=None
1017+
expected1_list, dtype="datetime64[us]", freq="QE-DEC", tz=None
10181018
)
10191019
expected2 = DatetimeIndex(
1020-
expected2_list, dtype="datetime64[ns]", freq="W-SUN", tz=None
1020+
expected2_list, dtype="datetime64[us]", freq="W-SUN", tz=None
10211021
)
10221022
tm.assert_index_equal(result1, expected1)
10231023
tm.assert_index_equal(result2, expected2)
@@ -1110,15 +1110,15 @@ def test_bday_near_overflow(self):
11101110
# GH#24252 avoid doing unnecessary addition that _would_ overflow
11111111
start = Timestamp.max.floor("D").to_pydatetime()
11121112
rng = date_range(start, end=None, periods=1, freq="B")
1113-
expected = DatetimeIndex([start], freq="B").as_unit("ns")
1113+
expected = DatetimeIndex([start], freq="B")
11141114
tm.assert_index_equal(rng, expected)
11151115

11161116
def test_bday_overflow_error(self):
11171117
# GH#24252 check that we get OutOfBoundsDatetime and not OverflowError
11181118
msg = "Out of bounds nanosecond timestamp"
11191119
start = Timestamp.max.floor("D").to_pydatetime()
11201120
with pytest.raises(OutOfBoundsDatetime, match=msg):
1121-
date_range(start, periods=2, freq="B")
1121+
date_range(start, periods=2, freq="B", unit="ns")
11221122

11231123

11241124
class TestCustomDateRange:
@@ -1257,7 +1257,7 @@ def test_range_with_millisecond_resolution(self, start_end):
12571257
# https://github.com/pandas-dev/pandas/issues/24110
12581258
start, end = start_end
12591259
result = date_range(start=start, end=end, periods=2, inclusive="left")
1260-
expected = DatetimeIndex([start], dtype="M8[ns, UTC]")
1260+
expected = DatetimeIndex([start], dtype="M8[us, UTC]")
12611261
tm.assert_index_equal(result, expected)
12621262

12631263
@pytest.mark.parametrize(
@@ -1275,7 +1275,7 @@ def test_range_with_millisecond_resolution(self, start_end):
12751275
def test_range_with_timezone_and_custombusinessday(self, start, period, expected):
12761276
# GH49441
12771277
result = date_range(start=start, periods=period, freq="C")
1278-
expected = DatetimeIndex(expected).as_unit("ns")
1278+
expected = DatetimeIndex(expected).as_unit("us")
12791279
tm.assert_index_equal(result, expected)
12801280

12811281
def test_data_range_custombusinessday_partial_time(self, unit):
@@ -1316,7 +1316,7 @@ def test_cdaterange_cbh(self):
13161316
"2009-03-13 15:00:00",
13171317
"2009-03-13 16:00:00",
13181318
],
1319-
dtype="datetime64[ns]",
1319+
dtype="datetime64[us]",
13201320
freq="cbh",
13211321
)
13221322
tm.assert_index_equal(result, expected)

pandas/tests/indexes/interval/test_astype.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,8 @@ def test_subtype_integer(self, index, subtype):
221221

222222
if subtype != "int64":
223223
msg = (
224-
r"Cannot convert interval\[(timedelta64|datetime64)\[ns.*\], .*\] "
224+
r"Cannot convert interval"
225+
r"\[(timedelta64\[ns\]|datetime64\[us(, US/Eastern)?\]), .*\] "
225226
r"to interval\[uint64, .*\]"
226227
)
227228
with pytest.raises(TypeError, match=msg):

pandas/tests/indexes/interval/test_interval.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ def test_properties(self, closed):
8181
[
8282
[1, 1, 2, 5, 15, 53, 217, 1014, 5335, 31240, 201608],
8383
[-np.inf, -100, -10, 0.5, 1, 1.5, 3.8, 101, 202, np.inf],
84-
date_range("2017-01-01", "2017-01-04"),
84+
date_range("2017-01-01", "2017-01-04", unit="ns"),
8585
pytest.param(
8686
date_range("2017-01-01", "2017-01-04", unit="s"),
8787
marks=pytest.mark.xfail(reason="mismatched result unit"),
@@ -377,13 +377,16 @@ def test_maybe_convert_i8(self, breaks):
377377

378378
@pytest.mark.parametrize(
379379
"breaks",
380-
[date_range("2018-01-01", periods=5), timedelta_range("0 days", periods=5)],
380+
[
381+
date_range("2018-01-01", periods=5),
382+
timedelta_range("0 days", periods=5, unit="us"),
383+
],
381384
)
382385
def test_maybe_convert_i8_nat(self, breaks):
383386
# GH 20636
384387
index = IntervalIndex.from_breaks(breaks)
385388

386-
to_convert = breaks._constructor([pd.NaT] * 3).as_unit("ns")
389+
to_convert = breaks._constructor([pd.NaT] * 3).as_unit("us")
387390
expected = Index([np.nan] * 3, dtype=np.float64)
388391
result = index._maybe_convert_i8(to_convert)
389392
tm.assert_index_equal(result, expected)

pandas/tests/indexes/interval/test_interval_range.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ def test_constructor_coverage(self):
265265
tm.assert_index_equal(result, expected)
266266

267267
# equivalent timedelta-like start/end
268-
start, end = Timedelta(days=1), Timedelta(days=10)
268+
start, end = Timedelta(days=1).as_unit("us"), Timedelta(days=10).as_unit("us")
269269
expected = interval_range(start=start, end=end)
270270

271271
result = interval_range(start=start.to_pytimedelta(), end=end.to_pytimedelta())

pandas/tests/reshape/test_cut.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -794,7 +794,7 @@ def test_cut_bins_datetime_intervalindex():
794794
# https://github.com/pandas-dev/pandas/issues/46218
795795
bins = interval_range(Timestamp("2022-02-25"), Timestamp("2022-02-27"), freq="1D")
796796
# passing Series instead of list is important to trigger bug
797-
result = cut(Series([Timestamp("2022-02-26")]).astype("M8[ns]"), bins=bins)
797+
result = cut(Series([Timestamp("2022-02-26")]), bins=bins)
798798
expected = Categorical.from_codes([0], bins, ordered=True)
799799
tm.assert_categorical_equal(result.array, expected)
800800

pandas/tests/tseries/holiday/test_federal.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def test_federal_holiday_inconsistent_returntype():
5050

5151
results_2018 = cal1.holidays(start=datetime(2018, 8, 1), end=datetime(2018, 8, 31))
5252
results_2019 = cal2.holidays(start=datetime(2019, 8, 1), end=datetime(2019, 8, 31))
53-
expected_results = DatetimeIndex([], dtype="datetime64[ns]", freq=None)
53+
expected_results = DatetimeIndex([], dtype="datetime64[us]", freq=None)
5454

5555
# Check against expected results to ensure both date
5656
# ranges generate expected results as per GH49075 submission

pandas/tests/tseries/holiday/test_holiday.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ class TestHolidayCalendar(AbstractHolidayCalendar):
328328
start = Timestamp("2022-08-01")
329329
end = Timestamp("2022-08-31")
330330
year_offset = DateOffset(years=5)
331-
expected_results = DatetimeIndex([], dtype="datetime64[ns]", freq=None)
331+
expected_results = DatetimeIndex([], dtype="datetime64[us]", freq=None)
332332
test_cal = TestHolidayCalendar()
333333

334334
date_interval_low = test_cal.holidays(start - year_offset, end - year_offset)
@@ -350,7 +350,6 @@ def test_holidays_with_timezone_specified_but_no_occurrences():
350350
start_date, end_date, return_name=True
351351
)
352352
expected_results = Series("New Year's Day", index=[start_date])
353-
expected_results.index = expected_results.index.as_unit("ns")
354353

355354
tm.assert_equal(test_case, expected_results)
356355

@@ -378,7 +377,7 @@ def test_holiday_with_exclusion():
378377
Timestamp("2024-05-27"),
379378
Timestamp("2025-05-26"),
380379
],
381-
dtype="datetime64[ns]",
380+
dtype="datetime64[us]",
382381
)
383382
tm.assert_index_equal(result, expected)
384383

@@ -440,7 +439,7 @@ def test_holiday_with_multiple_exclusions():
440439
Timestamp("2064-01-01"),
441440
Timestamp("2065-01-01"),
442441
],
443-
dtype="datetime64[s]",
442+
dtype="datetime64[us]",
444443
)
445444
tm.assert_index_equal(result, expected)
446445

0 commit comments

Comments
 (0)