From 00c93d94770663833a57897a9803eae64ec26c8d Mon Sep 17 00:00:00 2001 From: John Cant Date: Sun, 29 Apr 2018 15:04:34 +0100 Subject: [PATCH] Fix #20744 . loffset ignored in upsample --- doc/source/whatsnew/v0.23.0.txt | 1 + pandas/core/resample.py | 1 + pandas/tests/test_resample.py | 31 +++++++++++++++++++++---------- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/doc/source/whatsnew/v0.23.0.txt b/doc/source/whatsnew/v0.23.0.txt index c128058858c17..a30cf2f3bc9ac 100644 --- a/doc/source/whatsnew/v0.23.0.txt +++ b/doc/source/whatsnew/v0.23.0.txt @@ -1200,6 +1200,7 @@ Groupby/Resample/Rolling - Bug in :func:`DataFrameGroupBy.cumsum` and :func:`DataFrameGroupBy.cumprod` when ``skipna`` was passed (:issue:`19806`) - Bug in :func:`DataFrame.resample` that dropped timezone information (:issue:`13238`) - Bug in :func:`DataFrame.groupby` where transformations using ``np.all`` and ``np.any`` were raising a ``ValueError`` (:issue:`20653`) +- Bug in :func:`DatetimeIndexResampler._upsample` where ``loffset`` was being ignored (:issue:`20744`) Sparse ^^^^^^ diff --git a/pandas/core/resample.py b/pandas/core/resample.py index bc7871a0d75c1..0707cc756682e 100644 --- a/pandas/core/resample.py +++ b/pandas/core/resample.py @@ -967,6 +967,7 @@ def _upsample(self, method, limit=None, fill_value=None): result = obj.reindex(res_index, method=method, limit=limit, fill_value=fill_value) + result = self._apply_loffset(result) return self._wrap_result(result) def _wrap_result(self, result): diff --git a/pandas/tests/test_resample.py b/pandas/tests/test_resample.py index 778ea73b3ef25..7e017686530ed 100644 --- a/pandas/tests/test_resample.py +++ b/pandas/tests/test_resample.py @@ -1153,22 +1153,33 @@ def test_resample_loffset(self): rng = date_range('1/1/2000 00:00:00', '1/1/2000 00:13:00', freq='min') s = Series(np.random.randn(14), index=rng) - result = s.resample('5min', closed='right', label='right', - loffset=timedelta(minutes=1)).mean() idx = date_range('1/1/2000', periods=4, freq='5min') - expected = Series([s[0], s[1:6].mean(), s[6:11].mean(), s[11:].mean()], - index=idx + timedelta(minutes=1)) - assert_series_equal(result, expected) - - expected = s.resample( + expected_downsample = Series([s[0], s[1:6].mean(), + s[6:11].mean(), s[11:].mean()], + index=idx + timedelta(minutes=1)) + # GH 20744 + expected_upsample = Series([s[0], s[5], s[10], s[-1]], + index=idx + timedelta(minutes=1)) + + # loffset should work for upsample and downsample + result_downsample = s.resample('5min', closed='right', label='right', + loffset=timedelta(minutes=1)).mean() + result_upsample = s.resample('5min', closed='right', label='right', + loffset=timedelta(minutes=1)).ffill() + + assert_series_equal(result_downsample, expected_downsample) + assert_series_equal(result_upsample, expected_upsample) + + # loffset should allow various types + result = s.resample( '5min', closed='right', label='right', loffset='1min').mean() - assert_series_equal(result, expected) + assert_series_equal(result, expected_downsample) - expected = s.resample( + result = s.resample( '5min', closed='right', label='right', loffset=Minute(1)).mean() - assert_series_equal(result, expected) + assert_series_equal(result, expected_downsample) assert result.index.freq == Minute(5)