Skip to content

Commit cb81f9a

Browse files
committed
ENH: new convention for period resampling pandas-dev#1635
1 parent f5a74d4 commit cb81f9a

File tree

2 files changed

+31
-4
lines changed

2 files changed

+31
-4
lines changed

pandas/tseries/resample.py

+12-4
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class TimeGrouper(CustomGrouper):
2626
closed : closed end of interval; left (default) or right
2727
label : interval boundary to use for labeling; left (default) or right
2828
nperiods : optional, integer
29-
convention : {'start', 'end', 'e', 's'}
29+
convention : {'start', 'end', 'e', 's', 'both'}
3030
If axis is PeriodIndex
3131
3232
Notes
@@ -216,12 +216,20 @@ def _resample_periods(self, obj):
216216
new_index = PeriodIndex(data=[], freq=self.freq)
217217
return obj.reindex(new_index)
218218
else:
219-
start = axlabels[0].asfreq(self.freq, how=self.convention)
220-
end = axlabels[-1].asfreq(self.freq, how=self.convention)
219+
start_conv = end_conv = self.convention
220+
if start_conv not in ('s', 'start', 'e', 'end'):
221+
start_conv = 's'
222+
if end_conv not in ('s', 'start', 'e', 'end'):
223+
end_conv = 'e'
224+
start = axlabels[0].asfreq(self.freq, how=start_conv)
225+
end = axlabels[-1].asfreq(self.freq, how=end_conv)
221226
new_index = period_range(start, end, freq=self.freq)
222227

223228
# Start vs. end of period
224-
memb = axlabels.asfreq(self.freq, how=self.convention)
229+
conv = self.convention
230+
if conv not in ('s', 'start', 'e', 'end'):
231+
conv = 's'
232+
memb = axlabels.asfreq(self.freq, how=conv)
225233

226234
if is_subperiod(axlabels.freq, self.freq) or self.how is not None:
227235
# Downsampling

pandas/tseries/tests/test_resample.py

+19
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,25 @@ def test_resample_timestamp_to_period(self):
286286
expected.index = period_range('1990-01', '2000-01', freq='M')
287287
assert_series_equal(result, expected)
288288

289+
def test_resample_period_both(self):
290+
prng = period_range('1/1/1999', freq='M', periods=3)
291+
s = Series(np.random.randn(len(prng)), prng)
292+
rs = s.resample('D', convention='both').index
293+
xp = period_range('1/1/1999', '3/31/1999', freq='D')
294+
rs.equals(xp)
295+
296+
prng = period_range('1/1/1999', freq='Q', periods=3)
297+
s = Series(np.random.randn(len(prng)), prng)
298+
rs = s.resample('M', convention='both').index
299+
xp = period_range('1/1/1999', '9/30/1999', freq='M')
300+
rs.equals(xp)
301+
302+
prng = period_range('1/1/1999', freq='A', periods=3)
303+
s = Series(np.random.randn(len(prng)), prng)
304+
rs = s.resample('A', convention='both').index
305+
xp = period_range('1/1/1999', '12/31/2001', freq='M')
306+
rs.equals(xp)
307+
289308
def test_ohlc_5min(self):
290309
def _ohlc(group):
291310
if isnull(group).all():

0 commit comments

Comments
 (0)