123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- import numpy as np
- import pytest
- import pandas as pd
- from pandas import DataFrame, Period, Series, period_range
- from pandas.core.arrays import PeriodArray
- import pandas.util.testing as tm
- class TestSeriesPeriod(object):
- def setup_method(self, method):
- self.series = Series(period_range('2000-01-01', periods=10, freq='D'))
- def test_auto_conversion(self):
- series = Series(list(period_range('2000-01-01', periods=10, freq='D')))
- assert series.dtype == 'Period[D]'
- series = pd.Series([pd.Period('2011-01-01', freq='D'),
- pd.Period('2011-02-01', freq='D')])
- assert series.dtype == 'Period[D]'
- def test_getitem(self):
- assert self.series[1] == pd.Period('2000-01-02', freq='D')
- result = self.series[[2, 4]]
- exp = pd.Series([pd.Period('2000-01-03', freq='D'),
- pd.Period('2000-01-05', freq='D')],
- index=[2, 4], dtype='Period[D]')
- tm.assert_series_equal(result, exp)
- assert result.dtype == 'Period[D]'
- def test_isna(self):
- # GH 13737
- s = Series([pd.Period('2011-01', freq='M'),
- pd.Period('NaT', freq='M')])
- tm.assert_series_equal(s.isna(), Series([False, True]))
- tm.assert_series_equal(s.notna(), Series([True, False]))
- def test_fillna(self):
- # GH 13737
- s = Series([pd.Period('2011-01', freq='M'),
- pd.Period('NaT', freq='M')])
- res = s.fillna(pd.Period('2012-01', freq='M'))
- exp = Series([pd.Period('2011-01', freq='M'),
- pd.Period('2012-01', freq='M')])
- tm.assert_series_equal(res, exp)
- assert res.dtype == 'Period[M]'
- def test_dropna(self):
- # GH 13737
- s = Series([pd.Period('2011-01', freq='M'),
- pd.Period('NaT', freq='M')])
- tm.assert_series_equal(s.dropna(),
- Series([pd.Period('2011-01', freq='M')]))
- def test_between(self):
- left, right = self.series[[2, 7]]
- result = self.series.between(left, right)
- expected = (self.series >= left) & (self.series <= right)
- tm.assert_series_equal(result, expected)
- # ---------------------------------------------------------------------
- # NaT support
- @pytest.mark.xfail(reason="PeriodDtype Series not supported yet")
- def test_NaT_scalar(self):
- series = Series([0, 1000, 2000, pd._libs.iNaT], dtype='period[D]')
- val = series[3]
- assert pd.isna(val)
- series[2] = val
- assert pd.isna(series[2])
- @pytest.mark.xfail(reason="PeriodDtype Series not supported yet")
- def test_NaT_cast(self):
- result = Series([np.nan]).astype('period[D]')
- expected = Series([pd.NaT])
- tm.assert_series_equal(result, expected)
- def test_set_none(self):
- self.series[3] = None
- assert self.series[3] is pd.NaT
- self.series[3:5] = None
- assert self.series[4] is pd.NaT
- def test_set_nan(self):
- # Do we want to allow this?
- self.series[5] = np.nan
- assert self.series[5] is pd.NaT
- self.series[5:7] = np.nan
- assert self.series[6] is pd.NaT
- def test_intercept_astype_object(self):
- expected = self.series.astype('object')
- df = DataFrame({'a': self.series,
- 'b': np.random.randn(len(self.series))})
- result = df.values.squeeze()
- assert (result[:, 0] == expected.values).all()
- df = DataFrame({'a': self.series, 'b': ['foo'] * len(self.series)})
- result = df.values.squeeze()
- assert (result[:, 0] == expected.values).all()
- def test_align_series(self, join_type):
- rng = period_range('1/1/2000', '1/1/2010', freq='A')
- ts = Series(np.random.randn(len(rng)), index=rng)
- ts.align(ts[::2], join=join_type)
- def test_truncate(self):
- # GH 17717
- idx1 = pd.PeriodIndex([
- pd.Period('2017-09-02'),
- pd.Period('2017-09-02'),
- pd.Period('2017-09-03')
- ])
- series1 = pd.Series([1, 2, 3], index=idx1)
- result1 = series1.truncate(after='2017-09-02')
- expected_idx1 = pd.PeriodIndex([
- pd.Period('2017-09-02'),
- pd.Period('2017-09-02')
- ])
- tm.assert_series_equal(result1, pd.Series([1, 2], index=expected_idx1))
- idx2 = pd.PeriodIndex([
- pd.Period('2017-09-03'),
- pd.Period('2017-09-02'),
- pd.Period('2017-09-03')
- ])
- series2 = pd.Series([1, 2, 3], index=idx2)
- result2 = series2.sort_index().truncate(after='2017-09-02')
- expected_idx2 = pd.PeriodIndex([
- pd.Period('2017-09-02')
- ])
- tm.assert_series_equal(result2, pd.Series([2], index=expected_idx2))
- @pytest.mark.parametrize('input_vals', [
- [Period('2016-01', freq='M'), Period('2016-02', freq='M')],
- [Period('2016-01-01', freq='D'), Period('2016-01-02', freq='D')],
- [Period('2016-01-01 00:00:00', freq='H'),
- Period('2016-01-01 01:00:00', freq='H')],
- [Period('2016-01-01 00:00:00', freq='M'),
- Period('2016-01-01 00:01:00', freq='M')],
- [Period('2016-01-01 00:00:00', freq='S'),
- Period('2016-01-01 00:00:01', freq='S')]
- ])
- def test_end_time_timevalues(self, input_vals):
- # GH 17157
- # Check that the time part of the Period is adjusted by end_time
- # when using the dt accessor on a Series
- input_vals = PeriodArray._from_sequence(np.asarray(input_vals))
- s = Series(input_vals)
- result = s.dt.end_time
- expected = s.apply(lambda x: x.end_time)
- tm.assert_series_equal(result, expected)
|