From 279cbb2b80b55cc55c6c0a69248620bfaf51bf59 Mon Sep 17 00:00:00 2001 From: MarcoGorelli <> Date: Mon, 16 Jan 2023 10:43:13 +0000 Subject: [PATCH 1/2] pass unit to validate_frequency --- pandas/core/arrays/datetimes.py | 2 +- pandas/tests/frame/methods/test_asfreq.py | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/pandas/core/arrays/datetimes.py b/pandas/core/arrays/datetimes.py index f1da99825d5fd..e276861f3f4ca 100644 --- a/pandas/core/arrays/datetimes.py +++ b/pandas/core/arrays/datetimes.py @@ -357,7 +357,7 @@ def _from_sequence_not_strict( if inferred_freq is None and freq is not None: # this condition precludes `freq_infer` - cls._validate_frequency(result, freq, ambiguous=ambiguous) + cls._validate_frequency(result, freq, ambiguous=ambiguous, unit=result.unit) elif freq_infer: # Set _freq directly to bypass duplicative _validate_frequency diff --git a/pandas/tests/frame/methods/test_asfreq.py b/pandas/tests/frame/methods/test_asfreq.py index 5b3e1614e1ada..9fa9f27e7e312 100644 --- a/pandas/tests/frame/methods/test_asfreq.py +++ b/pandas/tests/frame/methods/test_asfreq.py @@ -17,6 +17,10 @@ class TestAsFreq: + @pytest.fixture(params=["s", "ms", "us", "ns"]) + def unit(self, request): + return request.param + def test_asfreq2(self, frame_or_series): ts = frame_or_series( [0.0, 1.0, 2.0], @@ -197,3 +201,11 @@ def test_asfreq_with_unsorted_index(self, frame_or_series): result = result.asfreq("D") tm.assert_equal(result, expected) + + def test_asfreq_after_normalize(self, unit): + # https://github.com/pandas-dev/pandas/issues/50727 + result = DatetimeIndex( + date_range("2000", periods=2).as_unit(unit).normalize(), freq="D" + ) + expected = DatetimeIndex(["2000-01-01", "2000-01-02"], freq="D").as_unit(unit) + tm.assert_index_equal(result, expected) From 4f152fce64322427db7b4af9241cf57e9e21630c Mon Sep 17 00:00:00 2001 From: MarcoGorelli <> Date: Tue, 17 Jan 2023 11:13:37 +0000 Subject: [PATCH 2/2] set unit within _validate_frequency --- pandas/core/arrays/datetimelike.py | 7 ++++++- pandas/core/arrays/datetimes.py | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/pandas/core/arrays/datetimelike.py b/pandas/core/arrays/datetimelike.py index bb21bed2dc779..816d8abec1428 100644 --- a/pandas/core/arrays/datetimelike.py +++ b/pandas/core/arrays/datetimelike.py @@ -1897,7 +1897,12 @@ def _validate_frequency(cls, index, freq, **kwargs): try: on_freq = cls._generate_range( - start=index[0], end=None, periods=len(index), freq=freq, **kwargs + start=index[0], + end=None, + periods=len(index), + freq=freq, + unit=index.unit, + **kwargs, ) if not np.array_equal(index.asi8, on_freq.asi8): raise ValueError diff --git a/pandas/core/arrays/datetimes.py b/pandas/core/arrays/datetimes.py index 5cc87cdde8ebc..2c1ef7f05fa03 100644 --- a/pandas/core/arrays/datetimes.py +++ b/pandas/core/arrays/datetimes.py @@ -357,7 +357,7 @@ def _from_sequence_not_strict( if inferred_freq is None and freq is not None: # this condition precludes `freq_infer` - cls._validate_frequency(result, freq, ambiguous=ambiguous, unit=result.unit) + cls._validate_frequency(result, freq, ambiguous=ambiguous) elif freq_infer: # Set _freq directly to bypass duplicative _validate_frequency