Skip to content

Commit 6bb7366

Browse files
committed
BUG: Collision between equivalent frequencies 'QS-FEB' and 'QS-NOV'
1 parent db653a9 commit 6bb7366

File tree

2 files changed

+38
-8
lines changed

2 files changed

+38
-8
lines changed

pandas/core/arrays/datetimelike.py

+27-6
Original file line numberDiff line numberDiff line change
@@ -2519,20 +2519,41 @@ def _validate_inferred_freq(
25192519
-------
25202520
freq : DateOffset or None
25212521
"""
2522-
offset1 = to_offset(freq)
2523-
offset2 = to_offset(inferred_freq)
25242522

2525-
freq_equal = type(offset1) == type(offset2)
25262523

2524+
def _validate_inferred_freq(freq, inferred_freq):
2525+
"""
2526+
Ensure that freq matches inferred_freq unless they are logically equivalent.
2527+
"""
25272528
if inferred_freq is not None:
2528-
if freq is not None and not freq_equal:
2529+
if freq is not None:
2530+
offset1, offset2 = to_offset(freq), to_offset(inferred_freq)
2531+
if type(offset1) == type(offset2):
2532+
if hasattr(offset1, "startingMonth") and hasattr(
2533+
offset2, "startingMonth"
2534+
):
2535+
if (offset1.startingMonth - offset2.startingMonth) % 3 != 0:
2536+
raise ValueError(
2537+
f"Inferred frequency {inferred_freq} from passed "
2538+
"values does not conform to passed frequency "
2539+
f"{freq.freqstr}"
2540+
)
2541+
if (
2542+
hasattr(offset1, "n")
2543+
and hasattr(offset2, "n")
2544+
and offset1.n != offset2.n
2545+
):
2546+
raise ValueError(
2547+
f"Inferred frequency {inferred_freq} from passed "
2548+
"values does not conform to passed frequency "
2549+
f"{freq.freqstr}"
2550+
)
25292551
raise ValueError(
25302552
f"Inferred frequency {inferred_freq} from passed "
25312553
"values does not conform to passed frequency "
25322554
f"{freq.freqstr}"
25332555
)
2534-
if freq is None:
2535-
freq = inferred_freq
2556+
freq = inferred_freq
25362557

25372558
return freq
25382559

pandas/tests/indexes/datetimes/test_constructors.py

+11-2
Original file line numberDiff line numberDiff line change
@@ -1206,8 +1206,17 @@ def test_dti_constructor_object_dtype_dayfirst_yearfirst_with_tz(self):
12061206
tm.assert_index_equal(result2, expected2)
12071207

12081208
def test_validate_inferred_freq_equivalence(self):
1209-
idx = date_range("2020-02-01", freq="QS-FEB", periods=4)
1209+
idx = date_range("2022-02-01", freq="QS-FEB", periods=4)
12101210

12111211
new_idx = DatetimeIndex(idx, freq="QS-MAY")
1212-
12131212
assert isinstance(new_idx, DatetimeIndex)
1213+
1214+
msg = (
1215+
"Inferred frequency .* from passed "
1216+
"values does not conform to passed frequency .*"
1217+
)
1218+
with pytest.raises(
1219+
ValueError,
1220+
match=msg,
1221+
):
1222+
DatetimeIndex(idx, freq="QS-MAR")

0 commit comments

Comments
 (0)