From b805f0273e5f4f61bfbefe933cca21a14623a535 Mon Sep 17 00:00:00 2001 From: richard Date: Tue, 11 Apr 2023 21:17:17 -0400 Subject: [PATCH 1/8] REGR: DataFrame.resample fails on a frame with no columns --- doc/source/whatsnew/v2.0.1.rst | 1 + pandas/core/resample.py | 2 +- pandas/tests/resample/test_resample_api.py | 21 +++++++++++++ .../tests/resample/test_resampler_grouper.py | 31 ++++++++++++++++++- 4 files changed, 53 insertions(+), 2 deletions(-) diff --git a/doc/source/whatsnew/v2.0.1.rst b/doc/source/whatsnew/v2.0.1.rst index 13f06f92aa4ff..ccb9adc2c3780 100644 --- a/doc/source/whatsnew/v2.0.1.rst +++ b/doc/source/whatsnew/v2.0.1.rst @@ -14,6 +14,7 @@ including other versions of pandas. Fixed regressions ~~~~~~~~~~~~~~~~~ - Fixed regression for subclassed Series when constructing from a dictionary (:issue:`52445`) +- Fixed regression in :meth:`DataFrame.resample` raising on a DataFrame with no columns (:issue:`52484`) - Fixed regression in :meth:`Series.describe` showing ``RuntimeWarning`` for extension dtype :class:`Series` with one element (:issue:`52515`) - Fixed regression in :meth:`DataFrame.sort_values` not resetting index when :class:`DataFrame` is already sorted and ``ignore_index=True`` (:issue:`52553`) - Fixed regression in :meth:`MultiIndex.isin` raising ``TypeError`` for ``Generator`` (:issue:`52568`) diff --git a/pandas/core/resample.py b/pandas/core/resample.py index 8cc578b7fd0b6..82722c7d9299d 100644 --- a/pandas/core/resample.py +++ b/pandas/core/resample.py @@ -466,7 +466,7 @@ def _wrap_result(self, result): obj = self.obj if ( isinstance(result, ABCDataFrame) - and result.empty + and len(result) == 0 and not isinstance(result.index, PeriodIndex) ): result = result.set_index( diff --git a/pandas/tests/resample/test_resample_api.py b/pandas/tests/resample/test_resample_api.py index c97fa93cbd660..4f95386d5e4f0 100644 --- a/pandas/tests/resample/test_resample_api.py +++ b/pandas/tests/resample/test_resample_api.py @@ -1005,3 +1005,24 @@ def test_series_axis_param_depr(): ) with tm.assert_produces_warning(FutureWarning, match=warning_msg): test_series.resample("H", axis=0) + + +def test_resample_empty(): + # GH#52484 + df = DataFrame( + index=pd.to_datetime( + ["2018-01-01 00:00:00", "2018-01-01 12:00:00", "2018-01-02 00:00:00"] + ) + ) + expected = DataFrame( + index=pd.to_datetime( + [ + "2018-01-01 00:00:00", + "2018-01-01 08:00:00", + "2018-01-01 16:00:00", + "2018-01-02 00:00:00", + ] + ) + ) + result = df.resample("8H").mean() + tm.assert_frame_equal(result, expected) diff --git a/pandas/tests/resample/test_resampler_grouper.py b/pandas/tests/resample/test_resampler_grouper.py index fdc09246b479a..19fca8a75768b 100644 --- a/pandas/tests/resample/test_resampler_grouper.py +++ b/pandas/tests/resample/test_resampler_grouper.py @@ -494,7 +494,7 @@ def test_groupby_resample_with_list_of_keys(): @pytest.mark.parametrize("keys", [["a"], ["a", "b"]]) -def test_resample_empty_Dataframe(keys): +def test_resample_no_index(keys): # GH 47705 df = DataFrame([], columns=["a", "b", "date"]) df["date"] = pd.to_datetime(df["date"]) @@ -509,6 +509,35 @@ def test_resample_empty_Dataframe(keys): tm.assert_frame_equal(result, expected) +def test_resample_no_columns(): + # GH#52484 + df = DataFrame( + index=Index( + pd.to_datetime( + ["2018-01-01 00:00:00", "2018-01-01 12:00:00", "2018-01-02 00:00:00"] + ), + name="date", + ) + ) + result = df.groupby([0, 0, 1]).resample(rule=pd.to_timedelta("06:00:00")).mean() + index = pd.to_datetime( + [ + "2018-01-01 00:00:00", + "2018-01-01 06:00:00", + "2018-01-01 12:00:00", + "2018-01-02 00:00:00", + ] + ) + expected = DataFrame( + index=pd.MultiIndex( + levels=[[0, 1], index], + codes=[[0, 0, 0, 1], [0, 1, 2, 3]], + names=[None, "date"], + ) + ) + tm.assert_frame_equal(result, expected) + + def test_groupby_resample_size_all_index_same(): # GH 46826 df = DataFrame( From 4d1e61c3976a9cc51ae5c9b73ac044d1243b592b Mon Sep 17 00:00:00 2001 From: richard Date: Wed, 12 Apr 2023 21:24:27 -0400 Subject: [PATCH 2/8] Use intp --- pandas/tests/resample/test_resampler_grouper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/resample/test_resampler_grouper.py b/pandas/tests/resample/test_resampler_grouper.py index 19fca8a75768b..610c31f39aee0 100644 --- a/pandas/tests/resample/test_resampler_grouper.py +++ b/pandas/tests/resample/test_resampler_grouper.py @@ -530,7 +530,7 @@ def test_resample_no_columns(): ) expected = DataFrame( index=pd.MultiIndex( - levels=[[0, 1], index], + levels=[np.array([0, 1], dtype=np.intp), index], codes=[[0, 0, 0, 1], [0, 1, 2, 3]], names=[None, "date"], ) From 628d9b1496f4d848d16381c440a523360c60c815 Mon Sep 17 00:00:00 2001 From: Richard Shadrach Date: Sun, 16 Apr 2023 08:48:22 -0400 Subject: [PATCH 3/8] revert --- pandas/tests/resample/test_resampler_grouper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/resample/test_resampler_grouper.py b/pandas/tests/resample/test_resampler_grouper.py index 610c31f39aee0..19fca8a75768b 100644 --- a/pandas/tests/resample/test_resampler_grouper.py +++ b/pandas/tests/resample/test_resampler_grouper.py @@ -530,7 +530,7 @@ def test_resample_no_columns(): ) expected = DataFrame( index=pd.MultiIndex( - levels=[np.array([0, 1], dtype=np.intp), index], + levels=[[0, 1], index], codes=[[0, 0, 0, 1], [0, 1, 2, 3]], names=[None, "date"], ) From e2aaeab41baf6b15a1caa359a172e79930617fbb Mon Sep 17 00:00:00 2001 From: Richard Shadrach Date: Sun, 16 Apr 2023 09:03:24 -0400 Subject: [PATCH 4/8] check dtype when non-empty --- .../tests/resample/test_resampler_grouper.py | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/pandas/tests/resample/test_resampler_grouper.py b/pandas/tests/resample/test_resampler_grouper.py index 19fca8a75768b..240339b8494bf 100644 --- a/pandas/tests/resample/test_resampler_grouper.py +++ b/pandas/tests/resample/test_resampler_grouper.py @@ -538,6 +538,37 @@ def test_resample_no_columns(): tm.assert_frame_equal(result, expected) +def test_resample_one_column(): + # GH#52484 + df = DataFrame( + data=[4, 5, 6], + index=Index( + pd.to_datetime( + ["2018-01-01 00:00:00", "2018-01-01 12:00:00", "2018-01-02 00:00:00"] + ), + name="date", + ), + ) + result = df.groupby([0, 0, 1]).resample(rule=pd.to_timedelta("06:00:00")).mean() + index = pd.to_datetime( + [ + "2018-01-01 00:00:00", + "2018-01-01 06:00:00", + "2018-01-01 12:00:00", + "2018-01-02 00:00:00", + ] + ) + expected = DataFrame( + data=[4.0, np.nan, 5.0, 6.0], + index=pd.MultiIndex( + levels=[[0, 1], index], + codes=[[0, 0, 0, 1], [0, 1, 2, 3]], + names=[None, "date"], + ), + ) + tm.assert_frame_equal(result, expected) + + def test_groupby_resample_size_all_index_same(): # GH 46826 df = DataFrame( From fdfef1140feb6d5c861e5e633ffef875129e1f17 Mon Sep 17 00:00:00 2001 From: Richard Shadrach Date: Mon, 17 Apr 2023 16:56:13 -0400 Subject: [PATCH 5/8] revert --- .../tests/resample/test_resampler_grouper.py | 33 +------------------ 1 file changed, 1 insertion(+), 32 deletions(-) diff --git a/pandas/tests/resample/test_resampler_grouper.py b/pandas/tests/resample/test_resampler_grouper.py index ea8dbed34b6b1..0cfbb3faa45d2 100644 --- a/pandas/tests/resample/test_resampler_grouper.py +++ b/pandas/tests/resample/test_resampler_grouper.py @@ -563,7 +563,7 @@ def test_resample_no_columns(): ) expected = DataFrame( index=pd.MultiIndex( - levels=[[0, 1], index], + levels=[np.array([0, 1], dtype=np.intp), index], codes=[[0, 0, 0, 1], [0, 1, 2, 3]], names=[None, "date"], ) @@ -571,37 +571,6 @@ def test_resample_no_columns(): tm.assert_frame_equal(result, expected) -def test_resample_one_column(): - # GH#52484 - df = DataFrame( - data=[4, 5, 6], - index=Index( - pd.to_datetime( - ["2018-01-01 00:00:00", "2018-01-01 12:00:00", "2018-01-02 00:00:00"] - ), - name="date", - ), - ) - result = df.groupby([0, 0, 1]).resample(rule=pd.to_timedelta("06:00:00")).mean() - index = pd.to_datetime( - [ - "2018-01-01 00:00:00", - "2018-01-01 06:00:00", - "2018-01-01 12:00:00", - "2018-01-02 00:00:00", - ] - ) - expected = DataFrame( - data=[4.0, np.nan, 5.0, 6.0], - index=pd.MultiIndex( - levels=[[0, 1], index], - codes=[[0, 0, 0, 1], [0, 1, 2, 3]], - names=[None, "date"], - ), - ) - tm.assert_frame_equal(result, expected) - - def test_groupby_resample_size_all_index_same(): # GH 46826 df = DataFrame( From bfc5ca215b77bd8dba3cf780539180c9ae9f38e3 Mon Sep 17 00:00:00 2001 From: Richard Shadrach Date: Mon, 17 Apr 2023 17:00:45 -0400 Subject: [PATCH 6/8] Don't check dtype on Windows --- pandas/tests/resample/test_resampler_grouper.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pandas/tests/resample/test_resampler_grouper.py b/pandas/tests/resample/test_resampler_grouper.py index 0cfbb3faa45d2..508e4015921ac 100644 --- a/pandas/tests/resample/test_resampler_grouper.py +++ b/pandas/tests/resample/test_resampler_grouper.py @@ -3,6 +3,7 @@ import numpy as np import pytest +from pandas.compat import is_platform_windows from pandas.util._test_decorators import async_mark import pandas as pd @@ -568,7 +569,9 @@ def test_resample_no_columns(): names=[None, "date"], ) ) - tm.assert_frame_equal(result, expected) + + # GH#52710 + tm.assert_frame_equal(result, expected, check_dtype=not is_platform_windows()) def test_groupby_resample_size_all_index_same(): From 77c2fd9fee029fefa45c2148c956b4d1f8f1141f Mon Sep 17 00:00:00 2001 From: Richard Shadrach Date: Mon, 17 Apr 2023 17:01:46 -0400 Subject: [PATCH 7/8] Add comment --- pandas/tests/resample/test_resampler_grouper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/resample/test_resampler_grouper.py b/pandas/tests/resample/test_resampler_grouper.py index 508e4015921ac..d431afa745154 100644 --- a/pandas/tests/resample/test_resampler_grouper.py +++ b/pandas/tests/resample/test_resampler_grouper.py @@ -570,7 +570,7 @@ def test_resample_no_columns(): ) ) - # GH#52710 + # GH#52710 - Index comes out as 32-bit on 64-bit Windows tm.assert_frame_equal(result, expected, check_dtype=not is_platform_windows()) From 7072fbac3b8463f6667272d8339a45d59de43925 Mon Sep 17 00:00:00 2001 From: Richard Shadrach Date: Tue, 18 Apr 2023 17:03:24 -0400 Subject: [PATCH 8/8] Use check_index_type --- pandas/tests/resample/test_resampler_grouper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/resample/test_resampler_grouper.py b/pandas/tests/resample/test_resampler_grouper.py index d431afa745154..f19b315400f69 100644 --- a/pandas/tests/resample/test_resampler_grouper.py +++ b/pandas/tests/resample/test_resampler_grouper.py @@ -571,7 +571,7 @@ def test_resample_no_columns(): ) # GH#52710 - Index comes out as 32-bit on 64-bit Windows - tm.assert_frame_equal(result, expected, check_dtype=not is_platform_windows()) + tm.assert_frame_equal(result, expected, check_index_type=not is_platform_windows()) def test_groupby_resample_size_all_index_same():