Skip to content

Commit 89485cf

Browse files
committed
BUG/TST: more test coverage, resample bugfix
1 parent 90499b4 commit 89485cf

File tree

5 files changed

+51
-19
lines changed

5 files changed

+51
-19
lines changed

pandas/core/series.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -1986,7 +1986,9 @@ def reindex(self, index=None, method=None, level=None, fill_value=np.nan,
19861986
index = _ensure_index(index)
19871987
if self.index.equals(index):
19881988
if copy:
1989-
return self.copy()
1989+
result = self.copy()
1990+
result.index = index
1991+
return result
19901992
else:
19911993
return self
19921994

pandas/tseries/index.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ def __new__(cls, data=None,
259259
subarr.offset = offset
260260
subarr.tz = tz
261261

262-
if verify_integrity:
262+
if verify_integrity and len(subarr) > 0:
263263
if offset is not None and not infer_freq:
264264
inferred = subarr.inferred_freq
265265
if inferred != offset.freqstr:

pandas/tseries/resample.py

+13-8
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ def resample(self, obj):
7070
else:
7171
obj = obj.to_timestamp(how=self.convention)
7272
return self._resample_timestamps(obj)
73-
else:
73+
else: # pragma: no cover
7474
raise TypeError('Only valid with DatetimeIndex or PeriodIndex')
7575

7676
def get_grouper(self, obj):
@@ -92,8 +92,8 @@ def _get_time_bins(self, axis):
9292
assert(isinstance(axis, DatetimeIndex))
9393

9494
if len(axis) == 0:
95-
# TODO: Should we be a bit more careful here?
96-
return [], [], []
95+
binner = labels = DatetimeIndex(data=[], freq=self.freq)
96+
return binner, [], labels
9797

9898
first, last = _get_range_edges(axis, self.begin, self.end, self.freq,
9999
closed=self.closed, base=self.base)
@@ -121,8 +121,9 @@ def _get_time_period_bins(self, axis):
121121
assert(isinstance(axis, DatetimeIndex))
122122

123123
if len(axis) == 0:
124-
# TODO: Should we be a bit more careful here?
125-
return [], [], []
124+
binner = labels = PeriodIndex(data=[], freq=self.freq)
125+
return binner, [], labels
126+
126127
labels = binner = PeriodIndex(start=axis[0], end=axis[-1],
127128
freq=self.freq)
128129

@@ -165,9 +166,13 @@ def _resample_timestamps(self, obj):
165166
def _resample_periods(self, obj):
166167
axlabels = obj._get_axis(self.axis)
167168

168-
start = axlabels[0].asfreq(self.freq, how=self.convention)
169-
end = axlabels[-1].asfreq(self.freq, how=self.convention)
170-
new_index = period_range(start, end, freq=self.freq)
169+
if len(axlabels) == 0:
170+
new_index = PeriodIndex(data=[], freq=self.freq)
171+
return obj.reindex(new_index)
172+
else:
173+
start = axlabels[0].asfreq(self.freq, how=self.convention)
174+
end = axlabels[-1].asfreq(self.freq, how=self.convention)
175+
new_index = period_range(start, end, freq=self.freq)
171176

172177
# Start vs. end of period
173178
memb = axlabels.asfreq(self.freq, how=self.convention)

pandas/tseries/tests/test_frequencies.py

+6
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,12 @@ def test_millisecond(self):
9292
def test_microsecond(self):
9393
self._check_tick(timedelta(microseconds=1), 'U')
9494

95+
def test_nanosecond(self):
96+
idx = DatetimeIndex(np.arange(0, 100, 10))
97+
inferred = idx.inferred_freq
98+
99+
self.assert_(inferred == '10N')
100+
95101
def _check_tick(self, base_delta, code):
96102
b = datetime.now()
97103
for i in range(1, 5):

pandas/tseries/tests/test_resample.py

+28-9
Original file line numberDiff line numberDiff line change
@@ -391,17 +391,17 @@ def test_resample_to_period_monthly_buglet(self):
391391
exp_index = period_range('Jan-2000', 'Dec-2000', freq='M')
392392
self.assert_(result.index.equals(exp_index))
393393

394-
def test_upsample_daily_business_daily(self):
395-
ts = _simple_ts('1/1/2000', '2/1/2000', freq='B')
394+
def test_resample_empty(self):
395+
ts = _simple_ts('1/1/2000', '2/1/2000')[:0]
396396

397-
result = ts.resample('D')
398-
expected = ts.reindex(date_range('1/3/2000', '2/1/2000'))
399-
assert_series_equal(result, expected)
397+
result = ts.resample('A')
398+
self.assert_(len(result) == 0)
399+
self.assert_(result.index.freqstr == 'A-DEC')
400+
401+
result = ts.resample('A', kind='period')
402+
self.assert_(len(result) == 0)
403+
self.assert_(result.index.freqstr == 'A-DEC')
400404

401-
ts = _simple_ts('1/1/2000', '2/1/2000')
402-
result = ts.resample('H')
403-
expected = ts.reindex(date_range('1/1/2000', '2/1/2000', freq='H'))
404-
assert_series_equal(result, expected)
405405

406406
def _simple_ts(start, end, freq='D'):
407407
rng = date_range(start, end, freq=freq)
@@ -565,6 +565,25 @@ def test_resample_5minute(self):
565565
expected = ts.to_timestamp().resample('5min')
566566
assert_series_equal(result, expected)
567567

568+
def test_upsample_daily_business_daily(self):
569+
ts = _simple_pts('1/1/2000', '2/1/2000', freq='B')
570+
571+
result = ts.resample('D')
572+
expected = ts.asfreq('D').reindex(period_range('1/3/2000', '2/1/2000'))
573+
assert_series_equal(result, expected)
574+
575+
ts = _simple_pts('1/1/2000', '2/1/2000')
576+
result = ts.resample('H', convention='s')
577+
exp_rng = period_range('1/1/2000', '2/1/2000', freq='H')
578+
expected = ts.asfreq('H', how='s').reindex(exp_rng)
579+
assert_series_equal(result, expected)
580+
581+
def test_resample_empty(self):
582+
ts = _simple_pts('1/1/2000', '2/1/2000')[:0]
583+
584+
result = ts.resample('A')
585+
self.assert_(len(result) == 0)
586+
568587
class TestTimeGrouper(unittest.TestCase):
569588

570589
def setUp(self):

0 commit comments

Comments
 (0)