Skip to content

Commit 076cb6a

Browse files
committed
BUG: OHLC-upsampling of PeriodIndex now returns DataFrame (GH 13083)
1 parent 83d7bd7 commit 076cb6a

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
@@ -833,6 +833,12 @@ def _downsample(self, how, **kwargs):
833833
# Downsampling
834834
return self._groupby_and_aggregate(how, grouper=self.grouper)
835835
elif is_superperiod(ax.freq, self.freq):
836+
if how == 'ohlc':
837+
# upsampling to subperiods is handled as an asfreq, which works
838+
# for pure aggregating/reducing methods
839+
# OHLC reduces along the time dimension, but creates multiple
840+
# values for each period -> handle by _groupby_and_aggregate()
841+
return self._groupby_and_aggregate(how, grouper=self.grouper)
836842
return self.asfreq()
837843
elif ax.freq == self.freq:
838844
return self.asfreq()
@@ -1228,7 +1234,10 @@ def _get_period_bins(self, ax):
12281234
memb = ax.asfreq(self.freq, how=self.convention)
12291235
i8 = memb.asi8
12301236
freq_mult = self.freq.n
1231-
rng = np.arange(i8[0], i8[-1] + 1, freq_mult)
1237+
# when upsampling to subperiods, we need to generate enough bins
1238+
expected_bins_count = len(binner) * freq_mult
1239+
i8_extend = expected_bins_count - (i8[-1] - i8[0])
1240+
rng = np.arange(i8[0], i8[-1] + i8_extend, freq_mult)
12321241
rng += freq_mult
12331242
bins = memb.searchsorted(rng, side='left')
12341243

pandas/tests/test_resample.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2843,6 +2843,29 @@ def test_loffset_returns_datetimeindex(self):
28432843
assert_frame_equal(result_agg, expected)
28442844
assert_frame_equal(result_how, expected)
28452845

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

28472870
class TestTimedeltaIndex(Base):
28482871
_index_factory = lambda x: timedelta_range

0 commit comments

Comments
 (0)