diff --git a/doc/source/whatsnew/v0.21.0.txt b/doc/source/whatsnew/v0.21.0.txt index 36ca79e8b8714..56275cda80e57 100644 --- a/doc/source/whatsnew/v0.21.0.txt +++ b/doc/source/whatsnew/v0.21.0.txt @@ -112,6 +112,7 @@ Plotting Groupby/Resample/Rolling ^^^^^^^^^^^^^^^^^^^^^^^^ +- Bug in ``DataFrame.resample().size()`` where an empty DataFrame did not return a Series (:issue:`14962`) diff --git a/pandas/core/resample.py b/pandas/core/resample.py index 2bb825541e23b..a8a48624fb885 100644 --- a/pandas/core/resample.py +++ b/pandas/core/resample.py @@ -17,6 +17,7 @@ from pandas.core.indexes.period import PeriodIndex, period_range import pandas.core.common as com import pandas.core.algorithms as algos +from pandas.core.dtypes.generic import ABCDataFrame import pandas.compat as compat from pandas.compat.numpy import function as nv @@ -549,6 +550,15 @@ def var(self, ddof=1, *args, **kwargs): nv.validate_resampler_func('var', args, kwargs) return self._downsample('var', ddof=ddof) + @Appender(GroupBy.size.__doc__) + def size(self): + # It's a special case as higher level does return + # a copy of 0-len objects. GH14962 + result = self._downsample('size') + if not len(self.ax) and isinstance(self._selected_obj, ABCDataFrame): + result = pd.Series([], index=result.index, dtype='int64') + return result + Resampler._deprecated_valids += dir(Resampler) @@ -563,8 +573,7 @@ def f(self, _method=method, *args, **kwargs): setattr(Resampler, method, f) # groupby & aggregate methods -for method in ['count', 'size']: - +for method in ['count']: def f(self, _method=method): return self._downsample(_method) f.__doc__ = getattr(GroupBy, method).__doc__ diff --git a/pandas/tests/test_resample.py b/pandas/tests/test_resample.py index 959e3d2f459ce..15bbd7a9ef5e9 100644 --- a/pandas/tests/test_resample.py +++ b/pandas/tests/test_resample.py @@ -783,15 +783,19 @@ def test_resample_empty_dataframe(self): for freq in ['M', 'D', 'H']: # count retains dimensions too - methods = downsample_methods + ['count'] + methods = downsample_methods + upsample_methods for method in methods: result = getattr(f.resample(freq), method)() + if method != 'size': + expected = f.copy() + else: + # GH14962 + expected = Series([]) - expected = f.copy() expected.index = f.index._shallow_copy(freq=freq) assert_index_equal(result.index, expected.index) assert result.index.freq == expected.index.freq - assert_frame_equal(result, expected, check_dtype=False) + assert_almost_equal(result, expected, check_dtype=False) # test size for GH13212 (currently stays as df)