Skip to content

Commit be8e591

Browse files
committed
dedicated tests
1 parent 615a712 commit be8e591

File tree

3 files changed

+74
-3
lines changed

3 files changed

+74
-3
lines changed

pandas/core/indexes/datetimes.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1108,9 +1108,14 @@ def date_range(
11081108
td = Timedelta(freq.offset)
11091109
if abbrev_to_npy_unit(td.unit) > creso:
11101110
unit = td.unit # type: ignore[assignment]
1111-
elif type(freq) is DateOffset and getattr(freq, "nanoseconds", 0) != 0:
1112-
# e.g. test_freq_dateoffset_with_relateivedelta_nanos
1113-
unit = "ns"
1111+
elif type(freq) is DateOffset:
1112+
if getattr(freq, "nanoseconds", 0) != 0:
1113+
# e.g. test_freq_dateoffset_with_relateivedelta_nanos
1114+
unit = "ns"
1115+
elif getattr(freq, "microseconds", 0) != 0 and unit != "ns":
1116+
unit = "us"
1117+
elif getattr(freq, "milliseconds", 0) != 0 and unit not in ["ns", "us"]:
1118+
unit = "ms"
11141119

11151120
dtarr = DatetimeArray._generate_range(
11161121
start=start,

pandas/tests/indexes/datetimes/test_date_range.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1814,3 +1814,40 @@ def test_date_range_tzaware_endpoints_accept_nonexistent(self):
18141814
"2015-03-28 01:30", "2015-03-30 01:30", freq="D"
18151815
).tz_localize(tz, nonexistent="shift_forward")
18161816
tm.assert_index_equal(result, expected)
1817+
1818+
1819+
class TestDateRangeUnitInference:
1820+
def test_date_range_unit_inference_matching_unit(self, unit):
1821+
start = Timestamp("2025-11-25").as_unit(unit)
1822+
end = Timestamp("2025-11-26").as_unit(unit)
1823+
1824+
dti = date_range(start, end, freq="D")
1825+
assert dti.unit == unit
1826+
1827+
def test_date_range_unit_inference_mismatched_unit(self, unit):
1828+
start = Timestamp("2025-11-25").as_unit(unit)
1829+
end = Timestamp("2025-11-26").as_unit("s")
1830+
1831+
dti = date_range(start, end, freq="D")
1832+
assert dti.unit == unit
1833+
1834+
dti = date_range(start, end.as_unit("ns"), freq="D")
1835+
assert dti.unit == "ns"
1836+
1837+
def test_date_range_unit_inference_tick(self):
1838+
start = Timestamp("2025-11-25").as_unit("ms")
1839+
end = Timestamp("2025-11-26").as_unit("s")
1840+
1841+
dti = date_range(start, end, freq="2000000us")
1842+
assert dti.unit == "us"
1843+
1844+
dti = date_range(start, end.as_unit("ns"), freq="2000000us")
1845+
assert dti.unit == "ns"
1846+
1847+
def test_date_range_unit_inference_dateoffset_freq(self):
1848+
off = DateOffset(microseconds=2_000_000)
1849+
1850+
start = Timestamp("2025-11-25").as_unit("ms")
1851+
end = Timestamp("2025-11-26").as_unit("s")
1852+
dti = date_range(start, end, freq=off)
1853+
assert dti.unit == "us"

pandas/tests/indexes/timedeltas/test_timedelta_range.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,3 +154,32 @@ def test_timedelta_range_removed_freq(self, freq_depr, start, end):
154154
msg = f"Invalid frequency: {freq_depr}"
155155
with pytest.raises(ValueError, match=msg):
156156
timedelta_range(start=start, end=end, freq=freq_depr)
157+
158+
159+
class TestTimedeltaRangeUnitInference:
160+
def test_timedelta_range_unit_inference_matching_unit(self, unit):
161+
start = Timedelta(0).as_unit(unit)
162+
end = Timedelta(days=1).as_unit(unit)
163+
164+
tdi = timedelta_range(start, end, freq="D")
165+
assert tdi.unit == unit
166+
167+
def test_timedelta_range_unit_inference_mismatched_unit(self, unit):
168+
start = Timedelta(0).as_unit(unit)
169+
end = Timedelta(days=1).as_unit("s")
170+
171+
tdi = timedelta_range(start, end, freq="D")
172+
assert tdi.unit == unit
173+
174+
tdi = timedelta_range(start, end.as_unit("ns"), freq="D")
175+
assert tdi.unit == "ns"
176+
177+
def test_timedelta_range_unit_inference_tick(self):
178+
start = Timedelta(0).as_unit("ms")
179+
end = Timedelta(days=1).as_unit("s")
180+
181+
tdi = timedelta_range(start, end, freq="2000000us")
182+
assert tdi.unit == "us"
183+
184+
tdi = timedelta_range(start, end.as_unit("ns"), freq="2000000us")
185+
assert tdi.unit == "ns"

0 commit comments

Comments
 (0)