From 68a02aadfdda0c1da40157b4faa74f3181c384e3 Mon Sep 17 00:00:00 2001 From: Alexander Buchkovsky Date: Thu, 2 Mar 2017 22:27:16 +0200 Subject: [PATCH 1/7] !B [pandas-dev/pandas#15549] resample with tz-aware: Values falls after last bin --- pandas/tseries/resample.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pandas/tseries/resample.py b/pandas/tseries/resample.py index 75e550a065fd2..f82f535f1c41b 100755 --- a/pandas/tseries/resample.py +++ b/pandas/tseries/resample.py @@ -1144,17 +1144,18 @@ def _get_time_bins(self, ax): if not isinstance(ax, DatetimeIndex): raise TypeError('axis must be a DatetimeIndex, but got ' 'an instance of %r' % type(ax).__name__) - if len(ax) == 0: binner = labels = DatetimeIndex( data=[], freq=self.freq, name=ax.name) return binner, [], labels - + + tz = ax.tz + ax = ax.tz_convert('UTC') + first, last = ax.min(), ax.max() first, last = _get_range_edges(first, last, self.freq, closed=self.closed, base=self.base) - tz = ax.tz # GH #12037 # use first/last directly instead of call replace() on them # because replace() will swallow the nanosecond part @@ -1163,8 +1164,7 @@ def _get_time_bins(self, ax): binner = labels = DatetimeIndex(freq=self.freq, start=first, end=last, - tz=tz, - name=ax.name) + name=ax.name).tz_convert(tz) # a little hack trimmed = False From 47b99acee84dd15001548179e16de55f56e90611 Mon Sep 17 00:00:00 2001 From: Alexander Buchkovsky Date: Thu, 2 Mar 2017 22:29:57 +0200 Subject: [PATCH 2/7] restore mistakenly removed line --- pandas/tseries/resample.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pandas/tseries/resample.py b/pandas/tseries/resample.py index f82f535f1c41b..39ca8002f27ac 100755 --- a/pandas/tseries/resample.py +++ b/pandas/tseries/resample.py @@ -1144,6 +1144,7 @@ def _get_time_bins(self, ax): if not isinstance(ax, DatetimeIndex): raise TypeError('axis must be a DatetimeIndex, but got ' 'an instance of %r' % type(ax).__name__) + if len(ax) == 0: binner = labels = DatetimeIndex( data=[], freq=self.freq, name=ax.name) From 04ce929073df83c3144244f9c6772636ce29f0c7 Mon Sep 17 00:00:00 2001 From: Alexander Buchkovsky Date: Thu, 2 Mar 2017 22:31:00 +0200 Subject: [PATCH 3/7] remove redundant whitespaces --- pandas/tseries/resample.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tseries/resample.py b/pandas/tseries/resample.py index 39ca8002f27ac..ac74802e4046d 100755 --- a/pandas/tseries/resample.py +++ b/pandas/tseries/resample.py @@ -1144,7 +1144,7 @@ def _get_time_bins(self, ax): if not isinstance(ax, DatetimeIndex): raise TypeError('axis must be a DatetimeIndex, but got ' 'an instance of %r' % type(ax).__name__) - + if len(ax) == 0: binner = labels = DatetimeIndex( data=[], freq=self.freq, name=ax.name) From a43bb1932986c6b5999e753477069105c6695350 Mon Sep 17 00:00:00 2001 From: Alexander Buchkovsky Date: Thu, 2 Mar 2017 22:31:51 +0200 Subject: [PATCH 4/7] remove redundant whitespaces --- pandas/tseries/resample.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tseries/resample.py b/pandas/tseries/resample.py index ac74802e4046d..3b938c305137f 100755 --- a/pandas/tseries/resample.py +++ b/pandas/tseries/resample.py @@ -1144,7 +1144,7 @@ def _get_time_bins(self, ax): if not isinstance(ax, DatetimeIndex): raise TypeError('axis must be a DatetimeIndex, but got ' 'an instance of %r' % type(ax).__name__) - + if len(ax) == 0: binner = labels = DatetimeIndex( data=[], freq=self.freq, name=ax.name) From 44fc3f29d83f657011570127c9d69dab64ef188a Mon Sep 17 00:00:00 2001 From: Alexander Buchkovsky Date: Fri, 3 Mar 2017 11:34:04 +0200 Subject: [PATCH 5/7] !U add tz to DatetimeIndex initialization --- pandas/tseries/resample.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pandas/tseries/resample.py b/pandas/tseries/resample.py index 3b938c305137f..538cba2b5901c 100755 --- a/pandas/tseries/resample.py +++ b/pandas/tseries/resample.py @@ -1165,6 +1165,7 @@ def _get_time_bins(self, ax): binner = labels = DatetimeIndex(freq=self.freq, start=first, end=last, + tz='UTC', name=ax.name).tz_convert(tz) # a little hack From 2a1d24c6d328941e2ab7b7f229d4c2367e4b3ff7 Mon Sep 17 00:00:00 2001 From: Alexander Buchkovsky Date: Fri, 3 Mar 2017 11:47:14 +0200 Subject: [PATCH 6/7] !U add test for a bug: resample with tz-aware: Values falls after last bin --- pandas/tests/tseries/test_resample.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pandas/tests/tseries/test_resample.py b/pandas/tests/tseries/test_resample.py index 1535bd665fe8b..56953dc378965 100755 --- a/pandas/tests/tseries/test_resample.py +++ b/pandas/tests/tseries/test_resample.py @@ -2670,6 +2670,11 @@ def test_resample_weekly_bug_1726(self): # it works! df.resample('W-MON', closed='left', label='left').first() + def test_resample_tz_aware_bug_15549(self): + index = pd.DatetimeIndex([1450137600000000000, 1474059600000000000], tz='UTC').tz_convert('America/Chicago') + df = pd.DataFrame([1, 2], index=index) + df.resample('12h', closed='right', label='right').last().ffill() + def test_resample_bms_2752(self): # GH2753 foo = pd.Series(index=pd.bdate_range('20000101', '20000201')) From d28ff98c89fb173b8b58dd0fc4e89b84440590e2 Mon Sep 17 00:00:00 2001 From: Alexander Buchkovsky Date: Fri, 3 Mar 2017 20:27:44 +0200 Subject: [PATCH 7/7] !U do not convert TZ to UTC if it not set --- pandas/tseries/resample.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pandas/tseries/resample.py b/pandas/tseries/resample.py index 538cba2b5901c..f759cd9613a81 100755 --- a/pandas/tseries/resample.py +++ b/pandas/tseries/resample.py @@ -1151,7 +1151,8 @@ def _get_time_bins(self, ax): return binner, [], labels tz = ax.tz - ax = ax.tz_convert('UTC') + if tz: + ax = ax.tz_convert('UTC') first, last = ax.min(), ax.max() first, last = _get_range_edges(first, last, self.freq,