diff --git a/pandas/core/arrays/datetimes.py b/pandas/core/arrays/datetimes.py index 2c1ef7f05fa03..53d02e92946d9 100644 --- a/pandas/core/arrays/datetimes.py +++ b/pandas/core/arrays/datetimes.py @@ -1031,7 +1031,7 @@ def tz_localize( if self.tz is not None: if tz is None: - new_dates = tz_convert_from_utc(self.asi8, self.tz) + new_dates = tz_convert_from_utc(self.asi8, self.tz, reso=self._creso) else: raise TypeError("Already tz-aware, use tz_convert to convert.") else: diff --git a/pandas/core/resample.py b/pandas/core/resample.py index d6cba824767b5..3c26299c93b70 100644 --- a/pandas/core/resample.py +++ b/pandas/core/resample.py @@ -1,7 +1,6 @@ from __future__ import annotations import copy -from datetime import timedelta from textwrap import dedent from typing import ( TYPE_CHECKING, @@ -90,7 +89,6 @@ ) from pandas.tseries.offsets import ( Day, - Nano, Tick, ) @@ -1715,7 +1713,7 @@ def _get_time_bins(self, ax: DatetimeIndex): name=ax.name, ambiguous=True, nonexistent="shift_forward", - ) + ).as_unit(ax.unit) ax_values = ax.asi8 binner, bin_edges = self._adjust_bin_edges(binner, ax_values) @@ -1751,7 +1749,11 @@ def _adjust_bin_edges(self, binner, ax_values): if self.closed == "right": # GH 21459, GH 9119: Adjust the bins relative to the wall time bin_edges = binner.tz_localize(None) - bin_edges = bin_edges + timedelta(1) - Nano(1) + bin_edges = ( + bin_edges + + Timedelta(days=1, unit=bin_edges.unit).as_unit(bin_edges.unit) + - Timedelta(1, unit=bin_edges.unit).as_unit(bin_edges.unit) + ) bin_edges = bin_edges.tz_localize(binner.tz).asi8 else: bin_edges = binner.asi8 diff --git a/pandas/tests/resample/test_datetime_index.py b/pandas/tests/resample/test_datetime_index.py index 0c264c107d3d6..d5720f9628073 100644 --- a/pandas/tests/resample/test_datetime_index.py +++ b/pandas/tests/resample/test_datetime_index.py @@ -51,9 +51,14 @@ def _static_values(index): return np.random.rand(len(index)) -def test_custom_grouper(index): +@pytest.fixture(params=["s", "ms", "us", "ns"]) +def unit(request): + return request.param - dti = index + +def test_custom_grouper(index, unit): + + dti = index.as_unit(unit) s = Series(np.array([1] * len(dti)), index=dti, dtype="int64") b = Grouper(freq=Minute(5)) @@ -80,7 +85,7 @@ def test_custom_grouper(index): arr = [1] + [5] * 2592 idx = dti[0:-1:5] idx = idx.append(dti[-1:]) - idx = DatetimeIndex(idx, freq="5T") + idx = DatetimeIndex(idx, freq="5T").as_unit(unit) expect = Series(arr, index=idx) # GH2763 - return input dtype if we can @@ -88,9 +93,9 @@ def test_custom_grouper(index): tm.assert_series_equal(result, expect) -def test_custom_grouper_df(index): +def test_custom_grouper_df(index, unit): b = Grouper(freq=Minute(5), closed="right", label="right") - dti = index + dti = index.as_unit(unit) df = DataFrame(np.random.rand(len(dti), 10), index=dti, dtype="float64") r = df.groupby(b).agg(np.sum) @@ -123,22 +128,26 @@ def test_custom_grouper_df(index): ), ], ) -def test_resample_basic(series, closed, expected): +def test_resample_basic(series, closed, expected, unit): s = series + s.index = s.index.as_unit(unit) expected = expected(s) + expected.index = expected.index.as_unit(unit) result = s.resample("5min", closed=closed, label="right").mean() tm.assert_series_equal(result, expected) -def test_resample_integerarray(): +def test_resample_integerarray(unit): # GH 25580, resample on IntegerArray ts = Series( - range(9), index=date_range("1/1/2000", periods=9, freq="T"), dtype="Int64" + range(9), + index=date_range("1/1/2000", periods=9, freq="T").as_unit(unit), + dtype="Int64", ) result = ts.resample("3T").sum() expected = Series( [3, 12, 21], - index=date_range("1/1/2000", periods=3, freq="3T"), + index=date_range("1/1/2000", periods=3, freq="3T").as_unit(unit), dtype="Int64", ) tm.assert_series_equal(result, expected) @@ -146,14 +155,15 @@ def test_resample_integerarray(): result = ts.resample("3T").mean() expected = Series( [1, 4, 7], - index=date_range("1/1/2000", periods=3, freq="3T"), + index=date_range("1/1/2000", periods=3, freq="3T").as_unit(unit), dtype="Float64", ) tm.assert_series_equal(result, expected) -def test_resample_basic_grouper(series): +def test_resample_basic_grouper(series, unit): s = series + s.index = s.index.as_unit(unit) result = s.resample("5Min").last() grouper = Grouper(freq=Minute(5), closed="left", label="left") expected = s.groupby(grouper).agg(lambda x: x[-1]) @@ -168,9 +178,10 @@ def test_resample_basic_grouper(series): "keyword,value", [("label", "righttt"), ("closed", "righttt"), ("convention", "starttt")], ) -def test_resample_string_kwargs(series, keyword, value): +def test_resample_string_kwargs(series, keyword, value, unit): # see gh-19303 # Check that wrong keyword argument strings raise an error + series.index = series.index.as_unit(unit) msg = f"Unsupported value {value} for `{keyword}`" with pytest.raises(ValueError, match=msg): series.resample("5min", **({keyword: value})) @@ -180,18 +191,21 @@ def test_resample_string_kwargs(series, keyword, value): "_index_start,_index_end,_index_name", [("1/1/2000 00:00:00", "1/1/2000 00:13:00", "index")], ) -def test_resample_how(series, downsample_method): +def test_resample_how(series, downsample_method, unit): if downsample_method == "ohlc": pytest.skip("covered by test_resample_how_ohlc") s = series + s.index = s.index.as_unit(unit) grouplist = np.ones_like(s) grouplist[0] = 0 grouplist[1:6] = 1 grouplist[6:11] = 2 grouplist[11:] = 3 expected = s.groupby(grouplist).agg(downsample_method) - expected.index = date_range("1/1/2000", periods=4, freq="5min", name="index") + expected.index = date_range( + "1/1/2000", periods=4, freq="5min", name="index" + ).as_unit(unit) result = getattr( s.resample("5min", closed="right", label="right"), downsample_method @@ -203,8 +217,9 @@ def test_resample_how(series, downsample_method): "_index_start,_index_end,_index_name", [("1/1/2000 00:00:00", "1/1/2000 00:13:00", "index")], ) -def test_resample_how_ohlc(series): +def test_resample_how_ohlc(series, unit): s = series + s.index = s.index.as_unit(unit) grouplist = np.ones_like(s) grouplist[0] = 0 grouplist[1:6] = 1 @@ -218,7 +233,9 @@ def _ohlc(group): expected = DataFrame( s.groupby(grouplist).agg(_ohlc).values.tolist(), - index=date_range("1/1/2000", periods=4, freq="5min", name="index"), + index=date_range("1/1/2000", periods=4, freq="5min", name="index").as_unit( + unit + ), columns=["open", "high", "low", "close"], ) @@ -227,9 +244,11 @@ def _ohlc(group): @pytest.mark.parametrize("func", ["min", "max", "sum", "prod", "mean", "var", "std"]) -def test_numpy_compat(func): +def test_numpy_compat(func, unit): # see gh-12811 - s = Series([1, 2, 3, 4, 5], index=date_range("20130101", periods=5, freq="s")) + s = Series( + [1, 2, 3, 4, 5], index=date_range("20130101", periods=5, freq="s").as_unit(unit) + ) r = s.resample("2s") msg = "numpy operations are not valid with resample" @@ -240,10 +259,10 @@ def test_numpy_compat(func): getattr(r, func)(axis=1) -def test_resample_how_callables(): +def test_resample_how_callables(unit): # GH#7929 data = np.arange(5, dtype=np.int64) - ind = date_range(start="2014-01-01", periods=len(data), freq="d") + ind = date_range(start="2014-01-01", periods=len(data), freq="d").as_unit(unit) df = DataFrame({"A": data, "B": data}, index=ind) def fn(x, a=1): @@ -265,7 +284,7 @@ def __call__(self, x): tm.assert_frame_equal(df_standard, df_class) -def test_resample_rounding(): +def test_resample_rounding(unit): # GH 8371 # odd results when rounding is needed @@ -295,43 +314,49 @@ def test_resample_rounding(): parse_dates={"timestamp": ["date", "time"]}, index_col="timestamp", ) + df.index = df.index.as_unit(unit) df.index.name = None result = df.resample("6s").sum() expected = DataFrame( - {"value": [4, 9, 4, 2]}, index=date_range("2014-11-08", freq="6s", periods=4) + {"value": [4, 9, 4, 2]}, + index=date_range("2014-11-08", freq="6s", periods=4).as_unit(unit), ) tm.assert_frame_equal(result, expected) result = df.resample("7s").sum() expected = DataFrame( - {"value": [4, 10, 4, 1]}, index=date_range("2014-11-08", freq="7s", periods=4) + {"value": [4, 10, 4, 1]}, + index=date_range("2014-11-08", freq="7s", periods=4).as_unit(unit), ) tm.assert_frame_equal(result, expected) result = df.resample("11s").sum() expected = DataFrame( - {"value": [11, 8]}, index=date_range("2014-11-08", freq="11s", periods=2) + {"value": [11, 8]}, + index=date_range("2014-11-08", freq="11s", periods=2).as_unit(unit), ) tm.assert_frame_equal(result, expected) result = df.resample("13s").sum() expected = DataFrame( - {"value": [13, 6]}, index=date_range("2014-11-08", freq="13s", periods=2) + {"value": [13, 6]}, + index=date_range("2014-11-08", freq="13s", periods=2).as_unit(unit), ) tm.assert_frame_equal(result, expected) result = df.resample("17s").sum() expected = DataFrame( - {"value": [16, 3]}, index=date_range("2014-11-08", freq="17s", periods=2) + {"value": [16, 3]}, + index=date_range("2014-11-08", freq="17s", periods=2).as_unit(unit), ) tm.assert_frame_equal(result, expected) -def test_resample_basic_from_daily(): +def test_resample_basic_from_daily(unit): # from daily dti = date_range( start=datetime(2005, 1, 1), end=datetime(2005, 1, 10), freq="D", name="index" - ) + ).as_unit(unit) s = Series(np.random.rand(len(dti)), dti) @@ -385,10 +410,10 @@ def test_resample_basic_from_daily(): assert result.index.name == "index" -def test_resample_upsampling_picked_but_not_correct(): +def test_resample_upsampling_picked_but_not_correct(unit): # Test for issue #3020 - dates = date_range("01-Jan-2014", "05-Jan-2014", freq="D") + dates = date_range("01-Jan-2014", "05-Jan-2014", freq="D").as_unit(unit) series = Series(1, index=dates) result = series.resample("D").mean() @@ -401,8 +426,10 @@ def test_resample_upsampling_picked_but_not_correct(): s = Series( np.arange(1.0, 6), index=[datetime(1975, 1, i, 12, 0) for i in range(1, 6)] ) + s.index = s.index.as_unit(unit) expected = Series( - np.arange(1.0, 6), index=date_range("19750101", periods=5, freq="D") + np.arange(1.0, 6), + index=date_range("19750101", periods=5, freq="D").as_unit(unit), ) result = s.resample("D").count() @@ -415,8 +442,9 @@ def test_resample_upsampling_picked_but_not_correct(): @pytest.mark.parametrize("f", ["sum", "mean", "prod", "min", "max", "var"]) -def test_resample_frame_basic_cy_funcs(f): +def test_resample_frame_basic_cy_funcs(f, unit): df = tm.makeTimeDataFrame() + df.index = df.index.as_unit(unit) b = Grouper(freq="M") g = df.groupby(b) @@ -426,23 +454,25 @@ def test_resample_frame_basic_cy_funcs(f): @pytest.mark.parametrize("freq", ["A", "M"]) -def test_resample_frame_basic_M_A(freq): +def test_resample_frame_basic_M_A(freq, unit): df = tm.makeTimeDataFrame() + df.index = df.index.as_unit(unit) result = df.resample(freq).mean() tm.assert_series_equal(result["A"], df["A"].resample(freq).mean()) @pytest.mark.parametrize("freq", ["W-WED", "M"]) -def test_resample_frame_basic_kind(freq): +def test_resample_frame_basic_kind(freq, unit): df = tm.makeTimeDataFrame() + df.index = df.index.as_unit(unit) df.resample(freq, kind="period").mean() -def test_resample_upsample(): +def test_resample_upsample(unit): # from daily dti = date_range( start=datetime(2005, 1, 1), end=datetime(2005, 1, 10), freq="D", name="index" - ) + ).as_unit(unit) s = Series(np.random.rand(len(dti)), dti) @@ -455,7 +485,7 @@ def test_resample_upsample(): assert result.index.name == "index" -def test_resample_how_method(): +def test_resample_how_method(unit): # GH9915 s = Series( [11, 22], @@ -464,6 +494,7 @@ def test_resample_how_method(): Timestamp("2015-03-31 21:49:52.739000"), ], ) + s.index = s.index.as_unit(unit) expected = Series( [11, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, 22], index=DatetimeIndex( @@ -479,22 +510,23 @@ def test_resample_how_method(): freq="10s", ), ) + expected.index = expected.index.as_unit(unit) tm.assert_series_equal(s.resample("10S").mean(), expected) -def test_resample_extra_index_point(): +def test_resample_extra_index_point(unit): # GH#9756 - index = date_range(start="20150101", end="20150331", freq="BM") + index = date_range(start="20150101", end="20150331", freq="BM").as_unit(unit) expected = DataFrame({"A": Series([21, 41, 63], index=index)}) - index = date_range(start="20150101", end="20150331", freq="B") + index = date_range(start="20150101", end="20150331", freq="B").as_unit(unit) df = DataFrame({"A": Series(range(len(index)), index=index)}, dtype="int64") result = df.resample("BM").last() tm.assert_frame_equal(result, expected) -def test_upsample_with_limit(): - rng = date_range("1/1/2000", periods=3, freq="5t") +def test_upsample_with_limit(unit): + rng = date_range("1/1/2000", periods=3, freq="5t").as_unit(unit) ts = Series(np.random.randn(len(rng)), rng) result = ts.resample("t").ffill(limit=2) @@ -504,9 +536,11 @@ def test_upsample_with_limit(): @pytest.mark.parametrize("freq", ["5D", "10H", "5Min", "10S"]) @pytest.mark.parametrize("rule", ["Y", "3M", "15D", "30H", "15Min", "30S"]) -def test_nearest_upsample_with_limit(tz_aware_fixture, freq, rule): +def test_nearest_upsample_with_limit(tz_aware_fixture, freq, rule, unit): # GH 33939 - rng = date_range("1/1/2000", periods=3, freq=freq, tz=tz_aware_fixture) + rng = date_range("1/1/2000", periods=3, freq=freq, tz=tz_aware_fixture).as_unit( + unit + ) ts = Series(np.random.randn(len(rng)), rng) result = ts.resample(rule).nearest(limit=2) @@ -514,8 +548,9 @@ def test_nearest_upsample_with_limit(tz_aware_fixture, freq, rule): tm.assert_series_equal(result, expected) -def test_resample_ohlc(series): +def test_resample_ohlc(series, unit): s = series + s.index = s.index.as_unit(unit) grouper = Grouper(freq=Minute(5)) expect = s.groupby(grouper).agg(lambda x: x[-1]) @@ -537,11 +572,11 @@ def test_resample_ohlc(series): assert xs["close"] == s[4] -def test_resample_ohlc_result(): +def test_resample_ohlc_result(unit): # GH 12332 - index = date_range("1-1-2000", "2-15-2000", freq="h") - index = index.union(date_range("4-15-2000", "5-15-2000", freq="h")) + index = date_range("1-1-2000", "2-15-2000", freq="h").as_unit(unit) + index = index.union(date_range("4-15-2000", "5-15-2000", freq="h").as_unit(unit)) s = Series(range(len(index)), index=index) a = s.loc[:"4-15-2000"].resample("30T").ohlc() @@ -551,10 +586,10 @@ def test_resample_ohlc_result(): assert isinstance(b, DataFrame) -def test_resample_ohlc_result_odd_period(): +def test_resample_ohlc_result_odd_period(unit): # GH12348 # raising on odd period - rng = date_range("2013-12-30", "2014-01-07") + rng = date_range("2013-12-30", "2014-01-07").as_unit(unit) index = rng.drop( [ Timestamp("2014-01-01"), @@ -565,11 +600,11 @@ def test_resample_ohlc_result_odd_period(): ) df = DataFrame(data=np.arange(len(index)), index=index) result = df.resample("B").mean() - expected = df.reindex(index=date_range(rng[0], rng[-1], freq="B")) + expected = df.reindex(index=date_range(rng[0], rng[-1], freq="B").as_unit(unit)) tm.assert_frame_equal(result, expected) -def test_resample_ohlc_dataframe(): +def test_resample_ohlc_dataframe(unit): df = ( DataFrame( { @@ -586,6 +621,7 @@ def test_resample_ohlc_dataframe(): } ) ).reindex(["VOLUME", "PRICE"], axis=1) + df.index = df.index.as_unit(unit) df.columns.name = "Cols" res = df.resample("H").ohlc() exp = pd.concat( @@ -632,8 +668,10 @@ def test_resample_dup_index(): tm.assert_frame_equal(result, expected) -def test_resample_reresample(): - dti = date_range(start=datetime(2005, 1, 1), end=datetime(2005, 1, 10), freq="D") +def test_resample_reresample(unit): + dti = date_range( + start=datetime(2005, 1, 1), end=datetime(2005, 1, 10), freq="D" + ).as_unit(unit) s = Series(np.random.rand(len(dti)), dti) bs = s.resample("B", closed="right", label="right").mean() result = bs.resample("8H").mean() @@ -650,8 +688,11 @@ def test_resample_reresample(): ["M", {"start": "1990-01", "end": "2000-01", "freq": "M"}], ], ) -def test_resample_timestamp_to_period(simple_date_range_series, freq, expected_kwargs): +def test_resample_timestamp_to_period( + simple_date_range_series, freq, expected_kwargs, unit +): ts = simple_date_range_series("1/1/1990", "1/1/2000") + ts.index = ts.index.as_unit(unit) result = ts.resample(freq, kind="period").mean() expected = ts.resample(freq).mean() @@ -659,13 +700,13 @@ def test_resample_timestamp_to_period(simple_date_range_series, freq, expected_k tm.assert_series_equal(result, expected) -def test_ohlc_5min(): +def test_ohlc_5min(unit): def _ohlc(group): if isna(group).all(): return np.repeat(np.nan, 4) return [group[0], group.max(), group.min(), group[-1]] - rng = date_range("1/1/2000 00:00:00", "1/1/2000 5:59:50", freq="10s") + rng = date_range("1/1/2000 00:00:00", "1/1/2000 5:59:50", freq="10s").as_unit(unit) ts = Series(np.random.randn(len(rng)), index=rng) resampled = ts.resample("5min", closed="right", label="right").ohlc() @@ -679,8 +720,8 @@ def _ohlc(group): assert (resampled.loc["1/1/2000 6:00:00"] == exp).all() -def test_downsample_non_unique(): - rng = date_range("1/1/2000", "2/29/2000") +def test_downsample_non_unique(unit): + rng = date_range("1/1/2000", "2/29/2000").as_unit(unit) rng2 = rng.repeat(5).values ts = Series(np.random.randn(len(rng2)), index=rng2) @@ -692,9 +733,9 @@ def test_downsample_non_unique(): tm.assert_almost_equal(result[1], expected[2]) -def test_asfreq_non_unique(): +def test_asfreq_non_unique(unit): # GH #1077 - rng = date_range("1/1/2000", "2/29/2000") + rng = date_range("1/1/2000", "2/29/2000").as_unit(unit) rng2 = rng.repeat(2).values ts = Series(np.random.randn(len(rng2)), index=rng2) @@ -703,8 +744,8 @@ def test_asfreq_non_unique(): ts.asfreq("B") -def test_resample_axis1(): - rng = date_range("1/1/2000", "2/29/2000") +def test_resample_axis1(unit): + rng = date_range("1/1/2000", "2/29/2000").as_unit(unit) df = DataFrame(np.random.randn(3, len(rng)), columns=rng, index=["a", "b", "c"]) result = df.resample("M", axis=1).mean() @@ -713,13 +754,13 @@ def test_resample_axis1(): @pytest.mark.parametrize("freq", ["t", "5t", "15t", "30t", "4h", "12h"]) -def test_resample_anchored_ticks(freq): +def test_resample_anchored_ticks(freq, unit): # If a fixed delta (5 minute, 4 hour) evenly divides a day, we should # "anchor" the origin at midnight so we get regular intervals rather # than starting from the first timestamp which might start in the # middle of a desired interval - rng = date_range("1/1/2000 04:00:00", periods=86400, freq="s") + rng = date_range("1/1/2000 04:00:00", periods=86400, freq="s").as_unit(unit) ts = Series(np.random.randn(len(rng)), index=rng) ts[:2] = np.nan # so results are the same result = ts[2:].resample(freq, closed="left", label="left").mean() @@ -728,33 +769,38 @@ def test_resample_anchored_ticks(freq): @pytest.mark.parametrize("end", [1, 2]) -def test_resample_single_group(end): +def test_resample_single_group(end, unit): mysum = lambda x: x.sum() - rng = date_range("2000-1-1", f"2000-{end}-10", freq="D") + rng = date_range("2000-1-1", f"2000-{end}-10", freq="D").as_unit(unit) ts = Series(np.random.randn(len(rng)), index=rng) tm.assert_series_equal(ts.resample("M").sum(), ts.resample("M").apply(mysum)) -def test_resample_single_group_std(): +def test_resample_single_group_std(unit): # GH 3849 s = Series( [30.1, 31.6], index=[Timestamp("20070915 15:30:00"), Timestamp("20070915 15:40:00")], ) - expected = Series([0.75], index=DatetimeIndex([Timestamp("20070915")], freq="D")) + s.index = s.index.as_unit(unit) + expected = Series( + [0.75], index=DatetimeIndex([Timestamp("20070915")], freq="D").as_unit(unit) + ) result = s.resample("D").apply(lambda x: np.std(x)) tm.assert_series_equal(result, expected) -def test_resample_offset(): +def test_resample_offset(unit): # GH 31809 - rng = date_range("1/1/2000 00:00:00", "1/1/2000 02:00", freq="s") + rng = date_range("1/1/2000 00:00:00", "1/1/2000 02:00", freq="s").as_unit(unit) ts = Series(np.random.randn(len(rng)), index=rng) resampled = ts.resample("5min", offset="2min").mean() - exp_rng = date_range("12/31/1999 23:57:00", "1/1/2000 01:57", freq="5min") + exp_rng = date_range("12/31/1999 23:57:00", "1/1/2000 01:57", freq="5min").as_unit( + unit + ) tm.assert_index_equal(resampled.index, exp_rng) @@ -769,12 +815,14 @@ def test_resample_offset(): {"offset": "-3m"}, ], ) -def test_resample_origin(kwargs): +def test_resample_origin(kwargs, unit): # GH 31809 - rng = date_range("2000-01-01 00:00:00", "2000-01-01 02:00", freq="s") + rng = date_range("2000-01-01 00:00:00", "2000-01-01 02:00", freq="s").as_unit(unit) ts = Series(np.random.randn(len(rng)), index=rng) - exp_rng = date_range("1999-12-31 23:57:00", "2000-01-01 01:57", freq="5min") + exp_rng = date_range( + "1999-12-31 23:57:00", "2000-01-01 01:57", freq="5min" + ).as_unit(unit) resampled = ts.resample("5min", **kwargs).mean() tm.assert_index_equal(resampled.index, exp_rng) @@ -783,8 +831,8 @@ def test_resample_origin(kwargs): @pytest.mark.parametrize( "origin", ["invalid_value", "epch", "startday", "startt", "2000-30-30", object()] ) -def test_resample_bad_origin(origin): - rng = date_range("2000-01-01 00:00:00", "2000-01-01 02:00", freq="s") +def test_resample_bad_origin(origin, unit): + rng = date_range("2000-01-01 00:00:00", "2000-01-01 02:00", freq="s").as_unit(unit) ts = Series(np.random.randn(len(rng)), index=rng) msg = ( "'origin' should be equal to 'epoch', 'start', 'start_day', " @@ -796,27 +844,31 @@ def test_resample_bad_origin(origin): @pytest.mark.parametrize("offset", ["invalid_value", "12dayys", "2000-30-30", object()]) -def test_resample_bad_offset(offset): - rng = date_range("2000-01-01 00:00:00", "2000-01-01 02:00", freq="s") +def test_resample_bad_offset(offset, unit): + rng = date_range("2000-01-01 00:00:00", "2000-01-01 02:00", freq="s").as_unit(unit) ts = Series(np.random.randn(len(rng)), index=rng) msg = f"'offset' should be a Timedelta convertible type. Got '{offset}' instead." with pytest.raises(ValueError, match=msg): ts.resample("5min", offset=offset) -def test_resample_origin_prime_freq(): +def test_resample_origin_prime_freq(unit): # GH 31809 start, end = "2000-10-01 23:30:00", "2000-10-02 00:30:00" - rng = date_range(start, end, freq="7min") + rng = date_range(start, end, freq="7min").as_unit(unit) ts = Series(np.random.randn(len(rng)), index=rng) - exp_rng = date_range("2000-10-01 23:14:00", "2000-10-02 00:22:00", freq="17min") + exp_rng = date_range( + "2000-10-01 23:14:00", "2000-10-02 00:22:00", freq="17min" + ).as_unit(unit) resampled = ts.resample("17min").mean() tm.assert_index_equal(resampled.index, exp_rng) resampled = ts.resample("17min", origin="start_day").mean() tm.assert_index_equal(resampled.index, exp_rng) - exp_rng = date_range("2000-10-01 23:30:00", "2000-10-02 00:21:00", freq="17min") + exp_rng = date_range( + "2000-10-01 23:30:00", "2000-10-02 00:21:00", freq="17min" + ).as_unit(unit) resampled = ts.resample("17min", origin="start").mean() tm.assert_index_equal(resampled.index, exp_rng) resampled = ts.resample("17min", offset="23h30min").mean() @@ -824,24 +876,32 @@ def test_resample_origin_prime_freq(): resampled = ts.resample("17min", origin="start_day", offset="23h30min").mean() tm.assert_index_equal(resampled.index, exp_rng) - exp_rng = date_range("2000-10-01 23:18:00", "2000-10-02 00:26:00", freq="17min") + exp_rng = date_range( + "2000-10-01 23:18:00", "2000-10-02 00:26:00", freq="17min" + ).as_unit(unit) resampled = ts.resample("17min", origin="epoch").mean() tm.assert_index_equal(resampled.index, exp_rng) - exp_rng = date_range("2000-10-01 23:24:00", "2000-10-02 00:15:00", freq="17min") + exp_rng = date_range( + "2000-10-01 23:24:00", "2000-10-02 00:15:00", freq="17min" + ).as_unit(unit) resampled = ts.resample("17min", origin="2000-01-01").mean() tm.assert_index_equal(resampled.index, exp_rng) -def test_resample_origin_with_tz(): +def test_resample_origin_with_tz(unit): # GH 31809 msg = "The origin must have the same timezone as the index." tz = "Europe/Paris" - rng = date_range("2000-01-01 00:00:00", "2000-01-01 02:00", freq="s", tz=tz) + rng = date_range( + "2000-01-01 00:00:00", "2000-01-01 02:00", freq="s", tz=tz + ).as_unit(unit) ts = Series(np.random.randn(len(rng)), index=rng) - exp_rng = date_range("1999-12-31 23:57:00", "2000-01-01 01:57", freq="5min", tz=tz) + exp_rng = date_range( + "1999-12-31 23:57:00", "2000-01-01 01:57", freq="5min", tz=tz + ).as_unit(unit) resampled = ts.resample("5min", origin="1999-12-31 23:57:00+00:00").mean() tm.assert_index_equal(resampled.index, exp_rng) @@ -856,16 +916,16 @@ def test_resample_origin_with_tz(): ts.resample("5min", origin="12/31/1999 23:57:00").mean() # if the series is not tz aware, origin should not be tz aware - rng = date_range("2000-01-01 00:00:00", "2000-01-01 02:00", freq="s") + rng = date_range("2000-01-01 00:00:00", "2000-01-01 02:00", freq="s").as_unit(unit) ts = Series(np.random.randn(len(rng)), index=rng) with pytest.raises(ValueError, match=msg): ts.resample("5min", origin="12/31/1999 23:57:00+03:00").mean() -def test_resample_origin_epoch_with_tz_day_vs_24h(): +def test_resample_origin_epoch_with_tz_day_vs_24h(unit): # GH 34474 start, end = "2000-10-01 23:30:00+0500", "2000-12-02 00:30:00+0500" - rng = date_range(start, end, freq="7min") + rng = date_range(start, end, freq="7min").as_unit(unit) random_values = np.random.randn(len(rng)) ts_1 = Series(random_values, index=rng) @@ -882,7 +942,7 @@ def test_resample_origin_epoch_with_tz_day_vs_24h(): # check that we have the similar results with two different timezones (+2H and +5H) start, end = "2000-10-01 23:30:00+0200", "2000-12-02 00:30:00+0200" - rng = date_range(start, end, freq="7min") + rng = date_range(start, end, freq="7min").as_unit(unit) ts_2 = Series(random_values, index=rng) result_5 = ts_2.resample("D", origin="epoch").mean() result_6 = ts_2.resample("24H", origin="epoch").mean() @@ -890,7 +950,7 @@ def test_resample_origin_epoch_with_tz_day_vs_24h(): tm.assert_series_equal(result_1.tz_localize(None), result_6.tz_localize(None)) -def test_resample_origin_with_day_freq_on_dst(): +def test_resample_origin_with_day_freq_on_dst(unit): # GH 31809 tz = "America/Chicago" @@ -899,13 +959,13 @@ def _create_series(values, timestamps, freq="D"): values, index=DatetimeIndex( [Timestamp(t, tz=tz) for t in timestamps], freq=freq, ambiguous=True - ), + ).as_unit(unit), ) # test classical behavior of origin in a DST context start = Timestamp("2013-11-02", tz=tz) end = Timestamp("2013-11-03 23:59", tz=tz) - rng = date_range(start, end, freq="1h") + rng = date_range(start, end, freq="1h").as_unit(unit) ts = Series(np.ones(len(rng)), index=rng) expected = _create_series([24.0, 25.0], ["2013-11-02", "2013-11-03"]) @@ -916,7 +976,7 @@ def _create_series(values, timestamps, freq="D"): # test complex behavior of origin/offset in a DST context start = Timestamp("2013-11-03", tz=tz) end = Timestamp("2013-11-03 23:59", tz=tz) - rng = date_range(start, end, freq="1h") + rng = date_range(start, end, freq="1h").as_unit(unit) ts = Series(np.ones(len(rng)), index=rng) expected_ts = ["2013-11-02 22:00-05:00", "2013-11-03 22:00-06:00"] @@ -945,8 +1005,8 @@ def _create_series(values, timestamps, freq="D"): tm.assert_series_equal(result, expected) -def test_resample_daily_anchored(): - rng = date_range("1/1/2000 0:00:00", periods=10000, freq="T") +def test_resample_daily_anchored(unit): + rng = date_range("1/1/2000 0:00:00", periods=10000, freq="T").as_unit(unit) ts = Series(np.random.randn(len(rng)), index=rng) ts[:2] = np.nan # so results are the same @@ -955,10 +1015,10 @@ def test_resample_daily_anchored(): tm.assert_series_equal(result, expected) -def test_resample_to_period_monthly_buglet(): +def test_resample_to_period_monthly_buglet(unit): # GH #1259 - rng = date_range("1/1/2000", "12/31/2000") + rng = date_range("1/1/2000", "12/31/2000").as_unit(unit) ts = Series(np.random.randn(len(rng)), index=rng) result = ts.resample("M", kind="period").mean() @@ -980,7 +1040,7 @@ def test_period_with_agg(): tm.assert_series_equal(result, expected) -def test_resample_segfault(): +def test_resample_segfault(unit): # GH 8573 # segfaulting in older versions all_wins_and_wagers = [ @@ -993,19 +1053,20 @@ def test_resample_segfault(): df = DataFrame.from_records( all_wins_and_wagers, columns=("ID", "timestamp", "A", "B") ).set_index("timestamp") + df.index = df.index.as_unit(unit) result = df.groupby("ID").resample("5min").sum() expected = df.groupby("ID").apply(lambda x: x.resample("5min").sum()) tm.assert_frame_equal(result, expected) -def test_resample_dtype_preservation(): +def test_resample_dtype_preservation(unit): # GH 12202 # validation tests for dtype preservation df = DataFrame( { - "date": date_range(start="2016-01-01", periods=4, freq="W"), + "date": date_range(start="2016-01-01", periods=4, freq="W").as_unit(unit), "group": [1, 1, 2, 2], "val": Series([5, 6, 7, 8], dtype="int32"), } @@ -1018,13 +1079,13 @@ def test_resample_dtype_preservation(): assert result.val.dtype == np.int32 -def test_resample_dtype_coercion(): +def test_resample_dtype_coercion(unit): pytest.importorskip("scipy.interpolate") # GH 16361 df = {"a": [1, 3, 1, 4]} - df = DataFrame(df, index=date_range("2017-01-01", "2017-01-04")) + df = DataFrame(df, index=date_range("2017-01-01", "2017-01-04").as_unit(unit)) expected = df.astype("float64").resample("H").mean()["a"].interpolate("cubic") @@ -1035,9 +1096,9 @@ def test_resample_dtype_coercion(): tm.assert_series_equal(result, expected) -def test_weekly_resample_buglet(): +def test_weekly_resample_buglet(unit): # #1327 - rng = date_range("1/1/2000", freq="B", periods=20) + rng = date_range("1/1/2000", freq="B", periods=20).as_unit(unit) ts = Series(np.random.randn(len(rng)), index=rng) resampled = ts.resample("W").mean() @@ -1045,9 +1106,9 @@ def test_weekly_resample_buglet(): tm.assert_series_equal(resampled, expected) -def test_monthly_resample_error(): +def test_monthly_resample_error(unit): # #1451 - dates = date_range("4/16/2012 20:00", periods=5000, freq="h") + dates = date_range("4/16/2012 20:00", periods=5000, freq="h").as_unit(unit) ts = Series(np.random.randn(len(dates)), index=dates) # it works! ts.resample("M") @@ -1069,16 +1130,16 @@ def test_nanosecond_resample_error(): tm.assert_series_equal(result, exp) -def test_resample_anchored_intraday(simple_date_range_series): +def test_resample_anchored_intraday(simple_date_range_series, unit): # #1471, #1458 - rng = date_range("1/1/2012", "4/1/2012", freq="100min") + rng = date_range("1/1/2012", "4/1/2012", freq="100min").as_unit(unit) df = DataFrame(rng.month, index=rng) result = df.resample("M").mean() expected = df.resample("M", kind="period").mean().to_timestamp(how="end") expected.index += Timedelta(1, "ns") - Timedelta(1, "D") - expected.index = expected.index._with_freq("infer") + expected.index = expected.index.as_unit(unit)._with_freq("infer") assert expected.index.freq == "M" tm.assert_frame_equal(result, expected) @@ -1087,11 +1148,11 @@ def test_resample_anchored_intraday(simple_date_range_series): exp = exp.to_timestamp(how="end") exp.index = exp.index + Timedelta(1, "ns") - Timedelta(1, "D") - exp.index = exp.index._with_freq("infer") + exp.index = exp.index.as_unit(unit)._with_freq("infer") assert exp.index.freq == "M" tm.assert_frame_equal(result, exp) - rng = date_range("1/1/2012", "4/1/2012", freq="100min") + rng = date_range("1/1/2012", "4/1/2012", freq="100min").as_unit(unit) df = DataFrame(rng.month, index=rng) result = df.resample("Q").mean() @@ -1099,6 +1160,7 @@ def test_resample_anchored_intraday(simple_date_range_series): expected.index += Timedelta(1, "ns") - Timedelta(1, "D") expected.index._data.freq = "Q" expected.index._freq = lib.no_default + expected.index = expected.index.as_unit(unit) tm.assert_frame_equal(result, expected) result = df.resample("Q", closed="left").mean() @@ -1107,16 +1169,19 @@ def test_resample_anchored_intraday(simple_date_range_series): expected.index += Timedelta(1, "ns") - Timedelta(1, "D") expected.index._data.freq = "Q" expected.index._freq = lib.no_default + expected.index = expected.index.as_unit(unit) tm.assert_frame_equal(result, expected) ts = simple_date_range_series("2012-04-29 23:00", "2012-04-30 5:00", freq="h") + ts.index = ts.index.as_unit(unit) resampled = ts.resample("M").mean() assert len(resampled) == 1 @pytest.mark.parametrize("freq", ["MS", "BMS", "QS-MAR", "AS-DEC", "AS-JUN"]) -def test_resample_anchored_monthstart(simple_date_range_series, freq): +def test_resample_anchored_monthstart(simple_date_range_series, freq, unit): ts = simple_date_range_series("1/1/2000", "12/31/2002") + ts.index = ts.index.as_unit(unit) ts.resample(freq).mean() @@ -1139,14 +1204,14 @@ def test_resample_anchored_multiday(label, sec): assert result.index[-1] == Timestamp(f"2014-10-15 23:00:{sec}00") -def test_corner_cases(): +def test_corner_cases(unit): # miscellaneous test coverage - rng = date_range("1/1/2000", periods=12, freq="t") + rng = date_range("1/1/2000", periods=12, freq="t").as_unit(unit) ts = Series(np.random.randn(len(rng)), index=rng) result = ts.resample("5t", closed="right", label="left").mean() - ex_index = date_range("1999-12-31 23:55", periods=4, freq="5t") + ex_index = date_range("1999-12-31 23:55", periods=4, freq="5t").as_unit(unit) tm.assert_index_equal(result.index, ex_index) @@ -1158,24 +1223,25 @@ def test_corner_cases_period(simple_period_range_series): assert len(result) == 0 -def test_corner_cases_date(simple_date_range_series): +def test_corner_cases_date(simple_date_range_series, unit): # resample to periods ts = simple_date_range_series("2000-04-28", "2000-04-30 11:00", freq="h") + ts.index = ts.index.as_unit(unit) result = ts.resample("M", kind="period").mean() assert len(result) == 1 assert result.index[0] == Period("2000-04", freq="M") -def test_anchored_lowercase_buglet(): - dates = date_range("4/16/2012 20:00", periods=50000, freq="s") +def test_anchored_lowercase_buglet(unit): + dates = date_range("4/16/2012 20:00", periods=50000, freq="s").as_unit(unit) ts = Series(np.random.randn(len(dates)), index=dates) # it works! ts.resample("d").mean() -def test_upsample_apply_functions(): +def test_upsample_apply_functions(unit): # #1596 - rng = date_range("2012-06-12", periods=4, freq="h") + rng = date_range("2012-06-12", periods=4, freq="h").as_unit(unit) ts = Series(np.random.randn(len(rng)), index=rng) @@ -1183,8 +1249,8 @@ def test_upsample_apply_functions(): assert isinstance(result, DataFrame) -def test_resample_not_monotonic(): - rng = date_range("2012-06-12", periods=200, freq="h") +def test_resample_not_monotonic(unit): + rng = date_range("2012-06-12", periods=200, freq="h").as_unit(unit) ts = Series(np.random.randn(len(rng)), index=rng) ts = ts.take(np.random.permutation(len(ts))) @@ -1224,9 +1290,10 @@ def test_resample_median_bug_1688(dtype): tm.assert_frame_equal(result, exp) -def test_how_lambda_functions(simple_date_range_series): +def test_how_lambda_functions(simple_date_range_series, unit): ts = simple_date_range_series("1/1/2000", "4/1/2000") + ts.index = ts.index.as_unit(unit) result = ts.resample("M").apply(lambda x: x.mean()) exp = ts.resample("M").mean() @@ -1251,29 +1318,29 @@ def test_how_lambda_functions(simple_date_range_series): tm.assert_series_equal(result["bar"], bar_exp, check_names=False) -def test_resample_unequal_times(): +def test_resample_unequal_times(unit): # #1772 start = datetime(1999, 3, 1, 5) # end hour is less than start end = datetime(2012, 7, 31, 4) - bad_ind = date_range(start, end, freq="30min") + bad_ind = date_range(start, end, freq="30min").as_unit(unit) df = DataFrame({"close": 1}, index=bad_ind) # it works! df.resample("AS").sum() -def test_resample_consistency(): +def test_resample_consistency(unit): # GH 6418 # resample with bfill / limit / reindex consistency - i30 = date_range("2002-02-02", periods=4, freq="30T") + i30 = date_range("2002-02-02", periods=4, freq="30T").as_unit(unit) s = Series(np.arange(4.0), index=i30) s[2] = np.NaN # Upsample by factor 3 with reindex() and resample() methods: - i10 = date_range(i30[0], i30[-1], freq="10T") + i10 = date_range(i30[0], i30[-1], freq="10T").as_unit(unit) s10 = s.reindex(index=i10, method="bfill") s10_2 = s.reindex(index=i10, method="bfill", limit=2) @@ -1335,7 +1402,7 @@ def test_resample_timegrouper(dates): tm.assert_frame_equal(result, expected) -def test_resample_nunique(): +def test_resample_nunique(unit): # GH 12352 df = DataFrame( @@ -1350,6 +1417,7 @@ def test_resample_nunique(): }, } ) + df.index = df.index.as_unit(unit) r = df.resample("D") g = df.groupby(Grouper(freq="D")) expected = df.groupby(Grouper(freq="D")).ID.apply(lambda x: x.nunique()) @@ -1366,9 +1434,10 @@ def test_resample_nunique(): tm.assert_series_equal(result, expected) -def test_resample_nunique_preserves_column_level_names(): +def test_resample_nunique_preserves_column_level_names(unit): # see gh-23222 df = tm.makeTimeDataFrame(freq="1D").abs() + df.index = df.index.as_unit(unit) df.columns = pd.MultiIndex.from_arrays( [df.columns.tolist()] * 2, names=["lev0", "lev1"] ) @@ -1385,11 +1454,11 @@ def test_resample_nunique_preserves_column_level_names(): ], ids=["nunique", "series_nunique", "nunique_str"], ) -def test_resample_nunique_with_date_gap(func): +def test_resample_nunique_with_date_gap(func, unit): # GH 13453 # Since all elements are unique, these should all be the same - index = date_range("1-1-2000", "2-15-2000", freq="h") - index2 = date_range("4-15-2000", "5-15-2000", freq="h") + index = date_range("1-1-2000", "2-15-2000", freq="h").as_unit(unit) + index2 = date_range("4-15-2000", "5-15-2000", freq="h").as_unit(unit) index3 = index.append(index2) s = Series(range(len(index3)), index=index3, dtype="int64") r = s.resample("M") @@ -1400,17 +1469,17 @@ def test_resample_nunique_with_date_gap(func): @pytest.mark.parametrize("n", [10000, 100000]) @pytest.mark.parametrize("k", [10, 100, 1000]) -def test_resample_group_info(n, k): +def test_resample_group_info(n, k, unit): # GH10914 # use a fixed seed to always have the same uniques prng = np.random.RandomState(1234) - dr = date_range(start="2015-08-27", periods=n // 10, freq="T") + dr = date_range(start="2015-08-27", periods=n // 10, freq="T").as_unit(unit) ts = Series(prng.randint(0, n // k, n).astype("int64"), index=prng.choice(dr, n)) left = ts.resample("30T").nunique() - ix = date_range(start=ts.index.min(), end=ts.index.max(), freq="30T") + ix = date_range(start=ts.index.min(), end=ts.index.max(), freq="30T").as_unit(unit) vals = ts.values bins = np.searchsorted(ix.values, ts.index, side="right") @@ -1427,13 +1496,13 @@ def test_resample_group_info(n, k): tm.assert_series_equal(left, right) -def test_resample_size(): +def test_resample_size(unit): n = 10000 - dr = date_range("2015-09-19", periods=n, freq="T") + dr = date_range("2015-09-19", periods=n, freq="T").as_unit(unit) ts = Series(np.random.randn(n), index=np.random.choice(dr, n)) left = ts.resample("7T").size() - ix = date_range(start=left.index.min(), end=ts.index.max(), freq="7T") + ix = date_range(start=left.index.min(), end=ts.index.max(), freq="7T").as_unit(unit) bins = np.searchsorted(ix.values, ts.index.values, side="right") val = np.bincount(bins, minlength=len(ix) + 1)[1:].astype("int64", copy=False) @@ -1474,29 +1543,31 @@ def test_resample_across_dst(): tm.assert_frame_equal(result, expected) -def test_groupby_with_dst_time_change(): +def test_groupby_with_dst_time_change(unit): # GH 24972 - index = DatetimeIndex( - [1478064900001000000, 1480037118776792000], tz="UTC" - ).tz_convert("America/Chicago") + index = ( + DatetimeIndex([1478064900001000000, 1480037118776792000], tz="UTC") + .tz_convert("America/Chicago") + .as_unit(unit) + ) df = DataFrame([1, 2], index=index) result = df.groupby(Grouper(freq="1d")).last() expected_index_values = date_range( "2016-11-02", "2016-11-24", freq="d", tz="America/Chicago" - ) + ).as_unit(unit) index = DatetimeIndex(expected_index_values) expected = DataFrame([1.0] + ([np.nan] * 21) + [2.0], index=index) tm.assert_frame_equal(result, expected) -def test_resample_dst_anchor(): +def test_resample_dst_anchor(unit): # 5172 - dti = DatetimeIndex([datetime(2012, 11, 4, 23)], tz="US/Eastern") + dti = DatetimeIndex([datetime(2012, 11, 4, 23)], tz="US/Eastern").as_unit(unit) df = DataFrame([5], index=dti) - dti = DatetimeIndex(df.index.normalize(), freq="D") + dti = DatetimeIndex(df.index.normalize(), freq="D").as_unit(unit) expected = DataFrame([5], index=dti) tm.assert_frame_equal(df.resample(rule="D").sum(), expected) df.resample(rule="MS").sum() @@ -1504,11 +1575,15 @@ def test_resample_dst_anchor(): df.resample(rule="MS").sum(), DataFrame( [5], - index=DatetimeIndex([datetime(2012, 11, 1)], tz="US/Eastern", freq="MS"), + index=DatetimeIndex( + [datetime(2012, 11, 1)], tz="US/Eastern", freq="MS" + ).as_unit(unit), ), ) - dti = date_range("2013-09-30", "2013-11-02", freq="30Min", tz="Europe/Paris") + dti = date_range( + "2013-09-30", "2013-11-02", freq="30Min", tz="Europe/Paris" + ).as_unit(unit) values = range(dti.size) df = DataFrame({"a": values, "b": values, "c": values}, index=dti, dtype="int64") how = {"a": "min", "b": "max", "c": "count"} @@ -1521,7 +1596,9 @@ def test_resample_dst_anchor(): "b": [47, 383, 719, 1055, 1393, 1586], "c": [48, 336, 336, 336, 338, 193], }, - index=date_range("9/30/2013", "11/4/2013", freq="W-MON", tz="Europe/Paris"), + index=date_range( + "9/30/2013", "11/4/2013", freq="W-MON", tz="Europe/Paris" + ).as_unit(unit), ), "W-MON Frequency", ) @@ -1536,7 +1613,7 @@ def test_resample_dst_anchor(): }, index=date_range( "9/30/2013", "11/11/2013", freq="2W-MON", tz="Europe/Paris" - ), + ).as_unit(unit), ), "2W-MON Frequency", ) @@ -1545,7 +1622,9 @@ def test_resample_dst_anchor(): df.resample("MS").agg(how)[["a", "b", "c"]], DataFrame( {"a": [0, 48, 1538], "b": [47, 1537, 1586], "c": [48, 1490, 49]}, - index=date_range("9/1/2013", "11/1/2013", freq="MS", tz="Europe/Paris"), + index=date_range( + "9/1/2013", "11/1/2013", freq="MS", tz="Europe/Paris" + ).as_unit(unit), ), "MS Frequency", ) @@ -1554,7 +1633,9 @@ def test_resample_dst_anchor(): df.resample("2MS").agg(how)[["a", "b", "c"]], DataFrame( {"a": [0, 1538], "b": [1537, 1586], "c": [1538, 49]}, - index=date_range("9/1/2013", "11/1/2013", freq="2MS", tz="Europe/Paris"), + index=date_range( + "9/1/2013", "11/1/2013", freq="2MS", tz="Europe/Paris" + ).as_unit(unit), ), "2MS Frequency", ) @@ -1570,32 +1651,34 @@ def test_resample_dst_anchor(): "b": [1295, 1345, 1393, 1441], "c": [48, 50, 48, 48], }, - index=date_range("10/26/2013", "10/29/2013", freq="D", tz="Europe/Paris"), + index=date_range( + "10/26/2013", "10/29/2013", freq="D", tz="Europe/Paris" + ).as_unit(unit), ), "D Frequency", ) -def test_downsample_across_dst(): +def test_downsample_across_dst(unit): # GH 8531 tz = pytz.timezone("Europe/Berlin") dt = datetime(2014, 10, 26) - dates = date_range(tz.localize(dt), periods=4, freq="2H") + dates = date_range(tz.localize(dt), periods=4, freq="2H").as_unit(unit) result = Series(5, index=dates).resample("H").mean() expected = Series( [5.0, np.nan] * 3 + [5.0], - index=date_range(tz.localize(dt), periods=7, freq="H"), + index=date_range(tz.localize(dt), periods=7, freq="H").as_unit(unit), ) tm.assert_series_equal(result, expected) -def test_downsample_across_dst_weekly(): +def test_downsample_across_dst_weekly(unit): # GH 9119, GH 21459 df = DataFrame( index=DatetimeIndex( ["2017-03-25", "2017-03-26", "2017-03-27", "2017-03-28", "2017-03-29"], tz="Europe/Amsterdam", - ), + ).as_unit(unit), data=[11, 12, 13, 14, 15], ) result = df.resample("1W").sum() @@ -1603,28 +1686,32 @@ def test_downsample_across_dst_weekly(): [23, 42], index=DatetimeIndex( ["2017-03-26", "2017-04-02"], tz="Europe/Amsterdam", freq="W" - ), + ).as_unit(unit), ) tm.assert_frame_equal(result, expected) -def test_downsample_across_dst_weekly_2(): +def test_downsample_across_dst_weekly_2(unit): # GH 9119, GH 21459 - idx = date_range("2013-04-01", "2013-05-01", tz="Europe/London", freq="H") + idx = date_range("2013-04-01", "2013-05-01", tz="Europe/London", freq="H").as_unit( + unit + ) s = Series(index=idx, dtype=np.float64) result = s.resample("W").mean() expected = Series( - index=date_range("2013-04-07", freq="W", periods=5, tz="Europe/London"), + index=date_range("2013-04-07", freq="W", periods=5, tz="Europe/London").as_unit( + unit + ), dtype=np.float64, ) tm.assert_series_equal(result, expected) -def test_downsample_dst_at_midnight(): +def test_downsample_dst_at_midnight(unit): # GH 25758 start = datetime(2018, 11, 3, 12) end = datetime(2018, 11, 5, 12) - index = date_range(start, end, freq="1H") + index = date_range(start, end, freq="1H").as_unit(unit) index = index.tz_localize("UTC").tz_convert("America/Havana") data = list(range(len(index))) dataframe = DataFrame(data, index=index) @@ -1633,12 +1720,12 @@ def test_downsample_dst_at_midnight(): dti = date_range("2018-11-03", periods=3).tz_localize( "America/Havana", ambiguous=True ) - dti = DatetimeIndex(dti, freq="D") + dti = DatetimeIndex(dti, freq="D").as_unit(unit) expected = DataFrame([7.5, 28.0, 44.5], index=dti) tm.assert_frame_equal(result, expected) -def test_resample_with_nat(): +def test_resample_with_nat(unit): # GH 13020 index = DatetimeIndex( [ @@ -1650,35 +1737,39 @@ def test_resample_with_nat(): ] ) frame = DataFrame([2, 3, 5, 7, 11], index=index) + frame.index = frame.index.as_unit(unit) index_1s = DatetimeIndex( ["1970-01-01 00:00:00", "1970-01-01 00:00:01", "1970-01-01 00:00:02"] - ) + ).as_unit(unit) frame_1s = DataFrame([3.0, 7.0, 11.0], index=index_1s) tm.assert_frame_equal(frame.resample("1s").mean(), frame_1s) - index_2s = DatetimeIndex(["1970-01-01 00:00:00", "1970-01-01 00:00:02"]) + index_2s = DatetimeIndex(["1970-01-01 00:00:00", "1970-01-01 00:00:02"]).as_unit( + unit + ) frame_2s = DataFrame([5.0, 11.0], index=index_2s) tm.assert_frame_equal(frame.resample("2s").mean(), frame_2s) - index_3s = DatetimeIndex(["1970-01-01 00:00:00"]) + index_3s = DatetimeIndex(["1970-01-01 00:00:00"]).as_unit(unit) frame_3s = DataFrame([7.0], index=index_3s) tm.assert_frame_equal(frame.resample("3s").mean(), frame_3s) tm.assert_frame_equal(frame.resample("60s").mean(), frame_3s) -def test_resample_datetime_values(): +def test_resample_datetime_values(unit): # GH 13119 # check that datetime dtype is preserved when NaT values are # introduced by the resampling dates = [datetime(2016, 1, 15), datetime(2016, 1, 19)] df = DataFrame({"timestamp": dates}, index=dates) + df.index = df.index.as_unit(unit) exp = Series( [datetime(2016, 1, 15), pd.NaT, datetime(2016, 1, 19)], - index=date_range("2016-01-15", periods=3, freq="2D"), + index=date_range("2016-01-15", periods=3, freq="2D").as_unit(unit), name="timestamp", ) @@ -1688,11 +1779,13 @@ def test_resample_datetime_values(): tm.assert_series_equal(res, exp) -def test_resample_apply_with_additional_args(series): +def test_resample_apply_with_additional_args(series, unit): # GH 14615 def f(data, add_arg): return np.mean(data) * add_arg + series.index = series.index.as_unit(unit) + multiplier = 10 result = series.resample("D").apply(f, multiplier) expected = series.resample("D").mean().multiply(multiplier) @@ -1726,11 +1819,14 @@ def f(data, add_arg): (24, "H", 1, "D"), ], ) -def test_resample_equivalent_offsets(n1, freq1, n2, freq2, k): +def test_resample_equivalent_offsets(n1, freq1, n2, freq2, k, unit): # GH 24127 n1_ = n1 * k n2_ = n2 * k - s = Series(0, index=date_range("19910905 13:00", "19911005 07:00", freq=freq1)) + s = Series( + 0, + index=date_range("19910905 13:00", "19911005 07:00", freq=freq1).as_unit(unit), + ) s = s + range(len(s)) result1 = s.resample(str(n1_) + freq1).mean() @@ -1749,11 +1845,11 @@ def test_resample_equivalent_offsets(n1, freq1, n2, freq2, k): ("1991-08", "1992-04", "M", "19910831", "19920531"), ], ) -def test_get_timestamp_range_edges(first, last, freq, exp_first, exp_last): +def test_get_timestamp_range_edges(first, last, freq, exp_first, exp_last, unit): first = Period(first) - first = first.to_timestamp(first.freq) + first = first.to_timestamp(first.freq).as_unit(unit) last = Period(last) - last = last.to_timestamp(last.freq) + last = last.to_timestamp(last.freq).as_unit(unit) exp_first = Timestamp(exp_first) exp_last = Timestamp(exp_last) @@ -1765,9 +1861,9 @@ def test_get_timestamp_range_edges(first, last, freq, exp_first, exp_last): @pytest.mark.parametrize("duplicates", [True, False]) -def test_resample_apply_product(duplicates): +def test_resample_apply_product(duplicates, unit): # GH 5586 - index = date_range(start="2012-01-31", freq="M", periods=12) + index = date_range(start="2012-01-31", freq="M", periods=12).as_unit(unit) ts = Series(range(12), index=index) df = DataFrame({"A": ts, "B": ts + 2}) @@ -1779,7 +1875,7 @@ def test_resample_apply_product(duplicates): np.array([[0, 24], [60, 210], [336, 720], [990, 1716]], dtype=np.int64), index=DatetimeIndex( ["2012-03-31", "2012-06-30", "2012-09-30", "2012-12-31"], freq="Q-DEC" - ), + ).as_unit(unit), columns=df.columns, ) tm.assert_frame_equal(result, expected) @@ -1821,34 +1917,39 @@ def test_resample_apply_product(duplicates): ], ) def test_resample_calendar_day_with_dst( - first: str, last: str, freq_in: str, freq_out: str, exp_last: str + first: str, last: str, freq_in: str, freq_out: str, exp_last: str, unit ): # GH 35219 - ts = Series(1.0, date_range(first, last, freq=freq_in, tz="Europe/Amsterdam")) + ts = Series( + 1.0, date_range(first, last, freq=freq_in, tz="Europe/Amsterdam").as_unit(unit) + ) result = ts.resample(freq_out).ffill() expected = Series( - 1.0, date_range(first, exp_last, freq=freq_out, tz="Europe/Amsterdam") + 1.0, + date_range(first, exp_last, freq=freq_out, tz="Europe/Amsterdam").as_unit(unit), ) tm.assert_series_equal(result, expected) @pytest.mark.parametrize("func", ["min", "max", "first", "last"]) -def test_resample_aggregate_functions_min_count(func): +def test_resample_aggregate_functions_min_count(func, unit): # GH#37768 - index = date_range(start="2020", freq="M", periods=3) + index = date_range(start="2020", freq="M", periods=3).as_unit(unit) ser = Series([1, np.nan, np.nan], index) result = getattr(ser.resample("Q"), func)(min_count=2) expected = Series( [np.nan], - index=DatetimeIndex(["2020-03-31"], dtype="datetime64[ns]", freq="Q-DEC"), + index=DatetimeIndex(["2020-03-31"], freq="Q-DEC").as_unit(unit), ) tm.assert_series_equal(result, expected) -def test_resample_unsigned_int(any_unsigned_int_numpy_dtype): +def test_resample_unsigned_int(any_unsigned_int_numpy_dtype, unit): # gh-43329 df = DataFrame( - index=date_range(start="2000-01-01", end="2000-01-03 23", freq="12H"), + index=date_range(start="2000-01-01", end="2000-01-03 23", freq="12H").as_unit( + unit + ), columns=["x"], data=[0, 1, 0] * 2, dtype=any_unsigned_int_numpy_dtype, @@ -1860,6 +1961,8 @@ def test_resample_unsigned_int(any_unsigned_int_numpy_dtype): expected = DataFrame( [1, np.nan, 0], columns=["x"], - index=date_range(start="2000-01-01", end="2000-01-03 23", freq="D"), + index=date_range(start="2000-01-01", end="2000-01-03 23", freq="D").as_unit( + unit + ), ) tm.assert_frame_equal(result, expected)