Skip to content

Commit 23566c2

Browse files
winklerandjreback
authored andcommitted
BUG: OHLC-upsampling of PeriodIndex now returns DataFrame (GH 13083)
1 parent 390e16e commit 23566c2

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

pandas/core/resample.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -883,6 +883,12 @@ def _downsample(self, how, **kwargs):
883883
# Downsampling
884884
return self._groupby_and_aggregate(how, grouper=self.grouper)
885885
elif is_superperiod(ax.freq, self.freq):
886+
if how == 'ohlc':
887+
# upsampling to subperiods is handled as an asfreq, which works
888+
# for pure aggregating/reducing methods
889+
# OHLC reduces along the time dimension, but creates multiple
890+
# values for each period -> handle by _groupby_and_aggregate()
891+
return self._groupby_and_aggregate(how, grouper=self.grouper)
886892
return self.asfreq()
887893
elif ax.freq == self.freq:
888894
return self.asfreq()
@@ -1278,7 +1284,10 @@ def _get_period_bins(self, ax):
12781284
memb = ax.asfreq(self.freq, how=self.convention)
12791285
i8 = memb.asi8
12801286
freq_mult = self.freq.n
1281-
rng = np.arange(i8[0], i8[-1] + 1, freq_mult)
1287+
# when upsampling to subperiods, we need to generate enough bins
1288+
expected_bins_count = len(binner) * freq_mult
1289+
i8_extend = expected_bins_count - (i8[-1] - i8[0])
1290+
rng = np.arange(i8[0], i8[-1] + i8_extend, freq_mult)
12821291
rng += freq_mult
12831292
bins = memb.searchsorted(rng, side='left')
12841293

pandas/tests/test_resample.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2890,6 +2890,29 @@ def test_loffset_returns_datetimeindex(self):
28902890
assert_frame_equal(result_agg, expected)
28912891
assert_frame_equal(result_how, expected)
28922892

2893+
def test_upsampling_ohlc(self):
2894+
# GH 13083
2895+
pi = PeriodIndex(start='2000', freq='D', periods=10)
2896+
s = Series(range(len(pi)), index=pi)
2897+
expected = s.to_timestamp().resample('H').ohlc().to_period()
2898+
# timestamp-based resampling doesn't include all sub-periods
2899+
# of the last original period, so extend accordingly:
2900+
pi_ext = PeriodIndex(start='2000', freq='H', periods=24 * len(pi))
2901+
expected = expected.reindex(pi_ext)
2902+
result = s.resample('H').ohlc()
2903+
assert_frame_equal(result, expected)
2904+
2905+
def test_upsampling_ohlc_freq_multiples(self):
2906+
pi = PeriodIndex(start='2000', freq='D', periods=10)
2907+
s = pd.Series(range(len(pi)), index=pi)
2908+
expected = s.to_timestamp().resample('12H').ohlc().to_period('12H')
2909+
# timestamp-based resampling doesn't include all sub-periods
2910+
# of the last original period, so extend accordingly:
2911+
pi_ext = PeriodIndex(start='2000', freq='12H', periods=2 * len(pi))
2912+
expected = expected.reindex(pi_ext)
2913+
result = s.resample('12H', kind='period').ohlc()
2914+
assert_frame_equal(result, expected)
2915+
28932916

28942917
class TestTimedeltaIndex(Base):
28952918
_index_factory = lambda x: timedelta_range

0 commit comments

Comments
 (0)