Skip to content

Commit 4211df2

Browse files
committed
BUG: OHLC-upsampling of PeriodIndex now returns DataFrame (GH 13083)
1 parent 626f017 commit 4211df2

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

pandas/core/resample.py

+10-1
Original file line numberDiff line numberDiff line change
@@ -842,6 +842,12 @@ def _downsample(self, how, **kwargs):
842842
# Downsampling
843843
return self._groupby_and_aggregate(how, grouper=self.grouper)
844844
elif is_superperiod(ax.freq, self.freq):
845+
if how == 'ohlc':
846+
# upsampling to subperiods is handled as an asfreq, which works
847+
# for pure aggregating/reducing methods
848+
# OHLC reduces along the time dimension, but creates multiple
849+
# values for each period -> handle by _groupby_and_aggregate()
850+
return self._groupby_and_aggregate(how, grouper=self.grouper)
845851
return self.asfreq()
846852
elif ax.freq == self.freq:
847853
return self.asfreq()
@@ -1254,7 +1260,10 @@ def _get_period_bins(self, ax):
12541260
memb = ax.asfreq(self.freq, how=self.convention)
12551261
i8 = memb.asi8
12561262
freq_mult = self.freq.n
1257-
rng = np.arange(i8[0], i8[-1] + 1, freq_mult)
1263+
# when upsampling to subperiods, we need to generate enough bins
1264+
expected_bins_count = len(binner) * freq_mult
1265+
i8_extend = expected_bins_count - (i8[-1] - i8[0])
1266+
rng = np.arange(i8[0], i8[-1] + i8_extend, freq_mult)
12581267
rng += freq_mult
12591268
bins = memb.searchsorted(rng, side='left')
12601269

pandas/tests/test_resample.py

+23
Original file line numberDiff line numberDiff line change
@@ -2847,6 +2847,29 @@ def test_loffset_returns_datetimeindex(self):
28472847
assert_frame_equal(result_agg, expected)
28482848
assert_frame_equal(result_how, expected)
28492849

2850+
def test_upsampling_ohlc(self):
2851+
# GH 13083
2852+
pi = PeriodIndex(start='2000', freq='D', periods=10)
2853+
s = Series(range(len(pi)), index=pi)
2854+
expected = s.to_timestamp().resample('H').ohlc().to_period()
2855+
# timestamp-based resampling doesn't include all sub-periods
2856+
# of the last original period, so extend accordingly:
2857+
pi_ext = PeriodIndex(start='2000', freq='H', periods=24 * len(pi))
2858+
expected = expected.reindex(pi_ext)
2859+
result = s.resample('H').ohlc()
2860+
assert_frame_equal(result, expected)
2861+
2862+
def test_upsampling_ohlc_freq_multiples(self):
2863+
pi = PeriodIndex(start='2000', freq='D', periods=10)
2864+
s = pd.Series(range(len(pi)), index=pi)
2865+
expected = s.to_timestamp().resample('12H').ohlc().to_period('12H')
2866+
# timestamp-based resampling doesn't include all sub-periods
2867+
# of the last original period, so extend accordingly:
2868+
pi_ext = PeriodIndex(start='2000', freq='12H', periods=2 * len(pi))
2869+
expected = expected.reindex(pi_ext)
2870+
result = s.resample('12H', kind='period').ohlc()
2871+
assert_frame_equal(result, expected)
2872+
28502873

28512874
class TestTimedeltaIndex(Base, tm.TestCase):
28522875
_index_factory = lambda x: timedelta_range

0 commit comments

Comments
 (0)