diff --git a/doc/source/timeseries.rst b/doc/source/timeseries.rst index 5dfac98d069e7..d0de34aa5eb4c 100644 --- a/doc/source/timeseries.rst +++ b/doc/source/timeseries.rst @@ -900,12 +900,31 @@ calendar time arithmetic. :class:`CalendarDay` is useful preserving calendar day semantics with date times with have day light savings transitions, i.e. :class:`CalendarDay` will preserve the hour before the day light savings transition. +Addition with :class:`CalendarDay`: + .. ipython:: python ts = pd.Timestamp('2016-10-30 00:00:00', tz='Europe/Helsinki') ts + pd.offsets.Day(1) ts + pd.offsets.CalendarDay(1) +Creating a :func:`date_range`: + +.. ipython:: python + + start = pd.Timestamp('2016-10-30 00:00:00', tz='Europe/Helsinki') + pd.date_range(start, freq='D', periods=3) + pd.date_range(start, freq='CD', periods=3) + +Resampling a timeseries: + +.. ipython:: python + + idx = pd.date_range("2016-10-30", freq='H', periods=4*24, tz='Europe/Helsinki') + s = pd.Series(range(len(idx)), index=idx) + s.resample('D').count() + s.resample('CD').count() + Parametric Offsets ~~~~~~~~~~~~~~~~~~ diff --git a/doc/source/whatsnew/v0.24.0.txt b/doc/source/whatsnew/v0.24.0.txt index 232f879285543..3e8f6ef7bd0e1 100644 --- a/doc/source/whatsnew/v0.24.0.txt +++ b/doc/source/whatsnew/v0.24.0.txt @@ -317,7 +317,10 @@ and respect calendar day arithmetic while :class:`Day` and frequency alias ``'D' will now respect absolute time (:issue:`22274`, :issue:`20596`, :issue:`16980`, :issue:`8774`) See the :ref:`documentation here ` for more information. -Addition with :class:`CalendarDay` across a daylight savings time transition: +The difference between :class:`Day` vs :class:`CalendarDay` is most apparent +with timezone-aware datetime data with a daylight savings time transition: + +Addition with :class:`CalendarDay`: .. ipython:: python @@ -325,6 +328,23 @@ Addition with :class:`CalendarDay` across a daylight savings time transition: ts + pd.offsets.Day(1) ts + pd.offsets.CalendarDay(1) +Creating a :func:`date_range`: + +.. ipython:: python + + start = pd.Timestamp('2016-10-30 00:00:00', tz='Europe/Helsinki') + pd.date_range(start, freq='D', periods=3) + pd.date_range(start, freq='CD', periods=3) + +Resampling a timeseries: + +.. ipython:: python + + idx = pd.date_range("2016-10-30", freq='H', periods=4*24, tz='Europe/Helsinki') + s = pd.Series(range(len(idx)), index=idx) + s.resample('D').count() + s.resample('CD').count() + .. _whatsnew_0240.api_breaking.period_end_time: Time values in ``dt.end_time`` and ``to_timestamp(how='end')`` diff --git a/pandas/tests/arrays/categorical/test_constructors.py b/pandas/tests/arrays/categorical/test_constructors.py index b5f499ba27323..8cb86ee488554 100644 --- a/pandas/tests/arrays/categorical/test_constructors.py +++ b/pandas/tests/arrays/categorical/test_constructors.py @@ -291,8 +291,9 @@ def test_constructor_with_datetimelike(self, dtl): result = repr(c) assert "NaT" in result - def test_constructor_from_index_series_datetimetz(self): - idx = date_range('2015-01-01 10:00', freq='D', periods=3, + @pytest.mark.parametrize('freq', ['CD', 'D']) + def test_constructor_from_index_series_datetimetz(self, freq): + idx = date_range('2015-01-01 10:00', freq=freq, periods=3, tz='US/Eastern') result = Categorical(idx) tm.assert_index_equal(result.categories, idx) diff --git a/pandas/tests/indexes/multi/test_partial_indexing.py b/pandas/tests/indexes/multi/test_partial_indexing.py index 40e5e26e9cb0f..a74169418b44b 100644 --- a/pandas/tests/indexes/multi/test_partial_indexing.py +++ b/pandas/tests/indexes/multi/test_partial_indexing.py @@ -6,7 +6,8 @@ from pandas import DataFrame, MultiIndex, date_range -def test_partial_string_timestamp_multiindex(): +@pytest.mark.parametrize('freq', ['D', 'CD']) +def test_partial_string_timestamp_multiindex(freq): # GH10331 dr = pd.date_range('2016-01-01', '2016-01-03', freq='12H') abc = ['a', 'b', 'c'] @@ -89,7 +90,7 @@ def test_partial_string_timestamp_multiindex(): df_swap.loc['2016-01-01'] # GH12685 (partial string with daily resolution or below) - dr = date_range('2013-01-01', periods=100, freq='D') + dr = date_range('2013-01-01', periods=100, freq=freq) ix = MultiIndex.from_product([dr, ['a', 'b']]) df = DataFrame(np.random.randn(200, 1), columns=['A'], index=ix) diff --git a/pandas/tests/io/formats/test_format.py b/pandas/tests/io/formats/test_format.py index c19f8e57f9ae7..3c5e6fcaa05d9 100644 --- a/pandas/tests/io/formats/test_format.py +++ b/pandas/tests/io/formats/test_format.py @@ -2497,11 +2497,12 @@ def test_date_nanos(self): result = fmt.Datetime64Formatter(x).get_result() assert result[0].strip() == "1970-01-01 00:00:00.000000200" - def test_dates_display(self): + @pytest.mark.parametrize('freq', ['CD', 'D']) + def test_dates_display(self, freq): # 10170 # make sure that we are consistently display date formatting - x = Series(date_range('20130101 09:00:00', periods=5, freq='D')) + x = Series(date_range('20130101 09:00:00', periods=5, freq=freq)) x.iloc[1] = np.nan result = fmt.Datetime64Formatter(x).get_result() assert result[0].strip() == "2013-01-01 09:00:00" diff --git a/pandas/tests/test_multilevel.py b/pandas/tests/test_multilevel.py index dcfeab55f94fc..fcac05c6b6388 100644 --- a/pandas/tests/test_multilevel.py +++ b/pandas/tests/test_multilevel.py @@ -71,9 +71,10 @@ def test_append(self): result = a['A'].append(b['A']) tm.assert_series_equal(result, self.frame['A']) - def test_append_index(self): + @pytest.mark.parametrize('freq', ['CD', 'D']) + def test_append_index(self, freq): idx1 = Index([1.1, 1.2, 1.3]) - idx2 = pd.date_range('2011-01-01', freq='D', periods=3, + idx2 = pd.date_range('2011-01-01', freq=freq, periods=3, tz='Asia/Tokyo') idx3 = Index(['A', 'B', 'C']) @@ -2223,75 +2224,76 @@ def test_set_index_datetime(self): tm.assert_index_equal(df.index.get_level_values(1), idx2) tm.assert_index_equal(df.index.get_level_values(2), idx3) - def test_reset_index_datetime(self): + @pytest.mark.parametrize('freq', ['CD', 'D']) + @pytest.mark.parametrize('tz', ['UTC', 'Asia/Tokyo', 'US/Eastern']) + def test_reset_index_datetime(self, freq, tz): # GH 3950 - for tz in ['UTC', 'Asia/Tokyo', 'US/Eastern']: - idx1 = pd.date_range('1/1/2011', periods=5, freq='D', tz=tz, - name='idx1') - idx2 = Index(range(5), name='idx2', dtype='int64') - idx = MultiIndex.from_arrays([idx1, idx2]) - df = DataFrame( - {'a': np.arange(5, dtype='int64'), - 'b': ['A', 'B', 'C', 'D', 'E']}, index=idx) - - expected = DataFrame({'idx1': [datetime.datetime(2011, 1, 1), - datetime.datetime(2011, 1, 2), - datetime.datetime(2011, 1, 3), - datetime.datetime(2011, 1, 4), - datetime.datetime(2011, 1, 5)], - 'idx2': np.arange(5, dtype='int64'), - 'a': np.arange(5, dtype='int64'), - 'b': ['A', 'B', 'C', 'D', 'E']}, - columns=['idx1', 'idx2', 'a', 'b']) - expected['idx1'] = expected['idx1'].apply( - lambda d: Timestamp(d, tz=tz)) - - tm.assert_frame_equal(df.reset_index(), expected) - - idx3 = pd.date_range('1/1/2012', periods=5, freq='MS', - tz='Europe/Paris', name='idx3') - idx = MultiIndex.from_arrays([idx1, idx2, idx3]) - df = DataFrame( - {'a': np.arange(5, dtype='int64'), - 'b': ['A', 'B', 'C', 'D', 'E']}, index=idx) - - expected = DataFrame({'idx1': [datetime.datetime(2011, 1, 1), - datetime.datetime(2011, 1, 2), - datetime.datetime(2011, 1, 3), - datetime.datetime(2011, 1, 4), - datetime.datetime(2011, 1, 5)], - 'idx2': np.arange(5, dtype='int64'), - 'idx3': [datetime.datetime(2012, 1, 1), - datetime.datetime(2012, 2, 1), - datetime.datetime(2012, 3, 1), - datetime.datetime(2012, 4, 1), - datetime.datetime(2012, 5, 1)], - 'a': np.arange(5, dtype='int64'), - 'b': ['A', 'B', 'C', 'D', 'E']}, - columns=['idx1', 'idx2', 'idx3', 'a', 'b']) - expected['idx1'] = expected['idx1'].apply( - lambda d: Timestamp(d, tz=tz)) - expected['idx3'] = expected['idx3'].apply( - lambda d: Timestamp(d, tz='Europe/Paris')) - tm.assert_frame_equal(df.reset_index(), expected) - - # GH 7793 - idx = MultiIndex.from_product([['a', 'b'], pd.date_range( - '20130101', periods=3, tz=tz)]) - df = DataFrame( - np.arange(6, dtype='int64').reshape( - 6, 1), columns=['a'], index=idx) - - expected = DataFrame({'level_0': 'a a a b b b'.split(), - 'level_1': [ - datetime.datetime(2013, 1, 1), - datetime.datetime(2013, 1, 2), - datetime.datetime(2013, 1, 3)] * 2, - 'a': np.arange(6, dtype='int64')}, - columns=['level_0', 'level_1', 'a']) - expected['level_1'] = expected['level_1'].apply( - lambda d: Timestamp(d, freq='D', tz=tz)) - tm.assert_frame_equal(df.reset_index(), expected) + idx1 = pd.date_range('1/1/2011', periods=5, freq=freq, tz=tz, + name='idx1') + idx2 = Index(range(5), name='idx2', dtype='int64') + idx = MultiIndex.from_arrays([idx1, idx2]) + df = DataFrame( + {'a': np.arange(5, dtype='int64'), + 'b': ['A', 'B', 'C', 'D', 'E']}, index=idx) + + expected = DataFrame({'idx1': [datetime.datetime(2011, 1, 1), + datetime.datetime(2011, 1, 2), + datetime.datetime(2011, 1, 3), + datetime.datetime(2011, 1, 4), + datetime.datetime(2011, 1, 5)], + 'idx2': np.arange(5, dtype='int64'), + 'a': np.arange(5, dtype='int64'), + 'b': ['A', 'B', 'C', 'D', 'E']}, + columns=['idx1', 'idx2', 'a', 'b']) + expected['idx1'] = expected['idx1'].apply( + lambda d: Timestamp(d, tz=tz)) + + tm.assert_frame_equal(df.reset_index(), expected) + + idx3 = pd.date_range('1/1/2012', periods=5, freq='MS', + tz='Europe/Paris', name='idx3') + idx = MultiIndex.from_arrays([idx1, idx2, idx3]) + df = DataFrame( + {'a': np.arange(5, dtype='int64'), + 'b': ['A', 'B', 'C', 'D', 'E']}, index=idx) + + expected = DataFrame({'idx1': [datetime.datetime(2011, 1, 1), + datetime.datetime(2011, 1, 2), + datetime.datetime(2011, 1, 3), + datetime.datetime(2011, 1, 4), + datetime.datetime(2011, 1, 5)], + 'idx2': np.arange(5, dtype='int64'), + 'idx3': [datetime.datetime(2012, 1, 1), + datetime.datetime(2012, 2, 1), + datetime.datetime(2012, 3, 1), + datetime.datetime(2012, 4, 1), + datetime.datetime(2012, 5, 1)], + 'a': np.arange(5, dtype='int64'), + 'b': ['A', 'B', 'C', 'D', 'E']}, + columns=['idx1', 'idx2', 'idx3', 'a', 'b']) + expected['idx1'] = expected['idx1'].apply( + lambda d: Timestamp(d, tz=tz)) + expected['idx3'] = expected['idx3'].apply( + lambda d: Timestamp(d, tz='Europe/Paris')) + tm.assert_frame_equal(df.reset_index(), expected) + + # GH 7793 + idx = MultiIndex.from_product([['a', 'b'], pd.date_range( + '20130101', periods=3, tz=tz)]) + df = DataFrame( + np.arange(6, dtype='int64').reshape( + 6, 1), columns=['a'], index=idx) + + expected = DataFrame({'level_0': 'a a a b b b'.split(), + 'level_1': [ + datetime.datetime(2013, 1, 1), + datetime.datetime(2013, 1, 2), + datetime.datetime(2013, 1, 3)] * 2, + 'a': np.arange(6, dtype='int64')}, + columns=['level_0', 'level_1', 'a']) + expected['level_1'] = expected['level_1'].apply( + lambda d: Timestamp(d, freq=freq, tz=tz)) + tm.assert_frame_equal(df.reset_index(), expected) def test_reset_index_period(self): # GH 7746 diff --git a/pandas/tests/test_resample.py b/pandas/tests/test_resample.py index 669fa9742a705..491974655baf1 100644 --- a/pandas/tests/test_resample.py +++ b/pandas/tests/test_resample.py @@ -279,12 +279,13 @@ def test_agg_consistency(self): # TODO: once GH 14008 is fixed, move these tests into # `Base` test class - def test_agg(self): + @pytest.mark.parametrize('freq', ['CD', 'D']) + def test_agg(self, freq): # test with all three Resampler apis and TimeGrouper np.random.seed(1234) index = date_range(datetime(2005, 1, 1), - datetime(2005, 1, 10), freq='D') + datetime(2005, 1, 10), freq=freq) index.name = 'date' df = DataFrame(np.random.rand(10, 2), columns=list('AB'), index=index) df_col = df.reset_index() @@ -369,12 +370,13 @@ def test_agg(self): ('r2', 'B', 'mean'), ('r2', 'B', 'sum')]) - def test_agg_misc(self): + @pytest.mark.parametrize('freq', ['CD', 'D']) + def test_agg_misc(self, freq): # test with all three Resampler apis and TimeGrouper np.random.seed(1234) index = date_range(datetime(2005, 1, 1), - datetime(2005, 1, 10), freq='D') + datetime(2005, 1, 10), freq=freq) index.name = 'date' df = DataFrame(np.random.rand(10, 2), columns=list('AB'), index=index) df_col = df.reset_index() @@ -473,11 +475,12 @@ def f(): pytest.raises(KeyError, f) - def test_agg_nested_dicts(self): + @pytest.mark.parametrize('freq', ['CD', 'D']) + def test_agg_nested_dicts(self, freq): np.random.seed(1234) index = date_range(datetime(2005, 1, 1), - datetime(2005, 1, 10), freq='D') + datetime(2005, 1, 10), freq=freq) index.name = 'date' df = DataFrame(np.random.rand(10, 2), columns=list('AB'), index=index) df_col = df.reset_index() @@ -531,10 +534,11 @@ def test_try_aggregate_non_existing_column(self): 'y': ['median'], 'z': ['sum']}) - def test_selection_api_validation(self): + @pytest.mark.parametrize('freq', ['CD', 'D']) + def test_selection_api_validation(self, freq): # GH 13500 index = date_range(datetime(2005, 1, 1), - datetime(2005, 1, 10), freq='D') + datetime(2005, 1, 10), freq=freq) rng = np.arange(len(index), dtype=np.int64) df = DataFrame({'date': index, 'a': rng}, @@ -1064,10 +1068,11 @@ def test_resample_rounding(self): ]}, index=date_range('2014-11-08', freq='17s', periods=2)) assert_frame_equal(result, expected) - def test_resample_basic_from_daily(self): + @pytest.mark.parametrize('freq', ['CD', 'D']) + def test_resample_basic_from_daily(self, freq): # from daily dti = DatetimeIndex(start=datetime(2005, 1, 1), - end=datetime(2005, 1, 10), freq='D', name='index') + end=datetime(2005, 1, 10), freq=freq, name='index') s = Series(np.random.rand(len(dti)), dti) @@ -1120,10 +1125,11 @@ def test_resample_basic_from_daily(self): assert result.iloc[5] == s['1/9/2005'] assert result.index.name == 'index' - def test_resample_upsampling_picked_but_not_correct(self): + @pytest.mark.parametrize('freq', ['CD', 'D']) + def test_resample_upsampling_picked_but_not_correct(self, freq): # Test for issue #3020 - dates = date_range('01-Jan-2014', '05-Jan-2014', freq='D') + dates = date_range('01-Jan-2014', '05-Jan-2014', freq=freq) series = Series(1, index=dates) result = series.resample('D').mean() @@ -1137,7 +1143,7 @@ def test_resample_upsampling_picked_but_not_correct(self): s = Series(np.arange(1., 6), index=[datetime.datetime( 1975, 1, i, 12, 0) for i in range(1, 6)]) expected = Series(np.arange(1., 6), index=date_range( - '19750101', periods=5, freq='D')) + '19750101', periods=5, freq=freq)) result = s.resample('D').count() assert_series_equal(result, Series(1, index=expected.index)) @@ -1170,7 +1176,8 @@ def test_resample_frame_basic(self): @pytest.mark.parametrize('loffset', [timedelta(minutes=1), '1min', Minute(1), np.timedelta64(1, 'm')]) - def test_resample_loffset(self, loffset): + @pytest.mark.parametrize('freq', ['CD', 'D']) + def test_resample_loffset(self, loffset, freq): # GH 7687 rng = date_range('1/1/2000 00:00:00', '1/1/2000 00:13:00', freq='min') s = Series(np.random.randn(14), index=rng) @@ -1185,7 +1192,7 @@ def test_resample_loffset(self, loffset): # from daily dti = DatetimeIndex(start=datetime(2005, 1, 1), - end=datetime(2005, 1, 10), freq='D') + end=datetime(2005, 1, 10), freq=freq) ser = Series(np.random.rand(len(dti)), dti) # to weekly @@ -1228,10 +1235,11 @@ def test_resample_loffset_count(self): assert_series_equal(result, expected) - def test_resample_upsample(self): + @pytest.mark.parametrize('freq', ['CD', 'D']) + def test_resample_upsample(self, freq): # from daily dti = DatetimeIndex(start=datetime(2005, 1, 1), - end=datetime(2005, 1, 10), freq='D', name='index') + end=datetime(2005, 1, 10), freq=freq, name='index') s = Series(np.random.rand(len(dti)), dti) @@ -1376,9 +1384,10 @@ def test_resample_dup_index(self): Period(year=2000, quarter=i + 1, freq='Q') for i in range(4)] assert_frame_equal(result, expected) - def test_resample_reresample(self): + @pytest.mark.parametrize('freq', ['CD', 'D']) + def test_resample_reresample(self, freq): dti = DatetimeIndex(start=datetime(2005, 1, 1), - end=datetime(2005, 1, 10), freq='D') + end=datetime(2005, 1, 10), freq=freq) s = Series(np.random.rand(len(dti)), dti) bs = s.resample('B', closed='right', label='right').mean() result = bs.resample('8H').mean() @@ -1520,15 +1529,16 @@ def test_resample_anchored_ticks(self): expected = ts.resample(freq, closed='left', label='left').mean() assert_series_equal(result, expected) - def test_resample_single_group(self): + @pytest.mark.parametrize('freq', ['CD', 'D']) + def test_resample_single_group(self, freq): mysum = lambda x: x.sum() - rng = date_range('2000-1-1', '2000-2-10', freq='D') + rng = date_range('2000-1-1', '2000-2-10', freq=freq) ts = Series(np.random.randn(len(rng)), index=rng) assert_series_equal(ts.resample('M').sum(), ts.resample('M').apply(mysum)) - rng = date_range('2000-1-1', '2000-1-10', freq='D') + rng = date_range('2000-1-1', '2000-1-10', freq=freq) ts = Series(np.random.randn(len(rng)), index=rng) assert_series_equal(ts.resample('M').sum(), ts.resample('M').apply(mysum)) @@ -1700,7 +1710,8 @@ def test_nanosecond_resample_error(self): assert_series_equal(result, exp) - def test_resample_anchored_intraday(self): + @pytest.mark.parametrize('freq', ['CD', 'D']) + def test_resample_anchored_intraday(self, freq): # #1471, #1458 rng = date_range('1/1/2012', '4/1/2012', freq='100min') @@ -1713,7 +1724,7 @@ def test_resample_anchored_intraday(self): tm.assert_frame_equal(result, expected) result = df.resample('M', closed='left').mean() - exp = df.tshift(1, freq='D').resample('M', kind='period').mean() + exp = df.tshift(1, freq=freq).resample('M', kind='period').mean() exp = exp.to_timestamp(how='end') exp.index = exp.index + Timedelta(1, 'ns') - Timedelta(1, 'D') @@ -1729,8 +1740,8 @@ def test_resample_anchored_intraday(self): tm.assert_frame_equal(result, expected) result = df.resample('Q', closed='left').mean() - expected = df.tshift(1, freq='D').resample('Q', kind='period', - closed='left').mean() + expected = df.tshift(1, freq=freq).resample('Q', kind='period', + closed='left').mean() expected = expected.to_timestamp(how='end') expected.index += Timedelta(1, 'ns') - Timedelta(1, 'D') tm.assert_frame_equal(result, expected) @@ -1922,7 +1933,8 @@ def test_resample_timegrouper(self): result = df.groupby(pd.Grouper(freq='M', key='A')).count() assert_frame_equal(result, expected) - def test_resample_nunique(self): + @pytest.mark.parametrize('freq', ['CD', 'D']) + def test_resample_nunique(self, freq): # GH 12352 df = DataFrame({ @@ -1931,9 +1943,9 @@ def test_resample_nunique(self): 'DATE': {Timestamp('2015-06-05 00:00:00'): '2015-06-05', Timestamp('2015-06-08 00:00:00'): '2015-06-08'}}) r = df.resample('D') - g = df.groupby(pd.Grouper(freq='D')) - expected = df.groupby(pd.Grouper(freq='D')).ID.apply(lambda x: - x.nunique()) + g = df.groupby(pd.Grouper(freq=freq)) + expected = df.groupby(pd.Grouper(freq=freq)).ID.apply(lambda x: + x.nunique()) assert expected.name == 'ID' for t in [r, g]: @@ -1943,7 +1955,7 @@ def test_resample_nunique(self): result = df.ID.resample('D').nunique() assert_series_equal(result, expected) - result = df.ID.groupby(pd.Grouper(freq='D')).nunique() + result = df.ID.groupby(pd.Grouper(freq=freq)).nunique() assert_series_equal(result, expected) def test_resample_nunique_with_date_gap(self): @@ -2599,7 +2611,8 @@ def test_resample_weekly_all_na(self): expected = ts.asfreq('W-THU').ffill() assert_series_equal(result, expected) - def test_resample_tz_localized(self): + @pytest.mark.parametrize('freq', ['CD', 'D']) + def test_resample_tz_localized(self, freq): dr = date_range(start='2012-4-13', end='2012-5-1') ts = Series(lrange(len(dr)), dr) @@ -2626,7 +2639,7 @@ def test_resample_tz_localized(self): s = Series([1, 2], index=idx) result = s.resample('D', closed='right', label='right').mean() - ex_index = date_range('2001-09-21', periods=1, freq='D', + ex_index = date_range('2001-09-21', periods=1, freq=freq, tz='Australia/Sydney') expected = Series([1.5], index=ex_index) @@ -3108,9 +3121,10 @@ def f(x): result = g.apply(f) assert_frame_equal(result, expected) - def test_apply_with_mutated_index(self): + @pytest.mark.parametrize('freq', ['CD', 'D']) + def test_apply_with_mutated_index(self, freq): # GH 15169 - index = pd.date_range('1-1-2015', '12-31-15', freq='D') + index = pd.date_range('1-1-2015', '12-31-15', freq=freq) df = DataFrame(data={'col1': np.random.rand(len(index))}, index=index) def f(x): @@ -3273,7 +3287,8 @@ def test_fails_on_no_datetime_index(self): "instance of %r" % name): df.groupby(TimeGrouper('D')) - def test_aaa_group_order(self): + @pytest.mark.parametrize('freq', ['CD', 'D']) + def test_aaa_group_order(self, freq): # GH 12840 # check TimeGrouper perform stable sorts n = 20 @@ -3282,7 +3297,7 @@ def test_aaa_group_order(self): df['key'] = [datetime(2013, 1, 1), datetime(2013, 1, 2), datetime(2013, 1, 3), datetime(2013, 1, 4), datetime(2013, 1, 5)] * 4 - grouped = df.groupby(TimeGrouper(key='key', freq='D')) + grouped = df.groupby(TimeGrouper(key='key', freq=freq)) tm.assert_frame_equal(grouped.get_group(datetime(2013, 1, 1)), df[::5]) @@ -3295,7 +3310,8 @@ def test_aaa_group_order(self): tm.assert_frame_equal(grouped.get_group(datetime(2013, 1, 5)), df[4::5]) - def test_aggregate_normal(self): + @pytest.mark.parametrize('freq', ['CD', 'D']) + def test_aggregate_normal(self, freq): # check TimeGrouper's aggregation is identical as normal groupby n = 20 @@ -3309,18 +3325,18 @@ def test_aggregate_normal(self): datetime(2013, 1, 5)] * 4 normal_grouped = normal_df.groupby('key') - dt_grouped = dt_df.groupby(TimeGrouper(key='key', freq='D')) + dt_grouped = dt_df.groupby(TimeGrouper(key='key', freq=freq)) for func in ['min', 'max', 'prod', 'var', 'std', 'mean']: expected = getattr(normal_grouped, func)() dt_result = getattr(dt_grouped, func)() - expected.index = date_range(start='2013-01-01', freq='D', + expected.index = date_range(start='2013-01-01', freq=freq, periods=5, name='key') assert_frame_equal(expected, dt_result) for func in ['count', 'sum']: expected = getattr(normal_grouped, func)() - expected.index = date_range(start='2013-01-01', freq='D', + expected.index = date_range(start='2013-01-01', freq=freq, periods=5, name='key') dt_result = getattr(dt_grouped, func)() assert_frame_equal(expected, dt_result) @@ -3328,7 +3344,7 @@ def test_aggregate_normal(self): # GH 7453 for func in ['size']: expected = getattr(normal_grouped, func)() - expected.index = date_range(start='2013-01-01', freq='D', + expected.index = date_range(start='2013-01-01', freq=freq, periods=5, name='key') dt_result = getattr(dt_grouped, func)() assert_series_equal(expected, dt_result) @@ -3336,7 +3352,7 @@ def test_aggregate_normal(self): # GH 7453 for func in ['first', 'last']: expected = getattr(normal_grouped, func)() - expected.index = date_range(start='2013-01-01', freq='D', + expected.index = date_range(start='2013-01-01', freq=freq, periods=5, name='key') dt_result = getattr(dt_grouped, func)() assert_frame_equal(expected, dt_result) @@ -3387,7 +3403,8 @@ def test_resample_entirly_nat_window(self, method, unit): ('prod', 1), ('count', 0), ]) - def test_aggregate_with_nat(self, func, fill_value): + @pytest.mark.parametrize('freq', ['CD', 'D']) + def test_aggregate_with_nat(self, func, fill_value, freq): # check TimeGrouper's aggregation is identical as normal groupby # if NaT is included, 'var', 'std', 'mean', 'first','last' # and 'nth' doesn't work yet @@ -3402,7 +3419,7 @@ def test_aggregate_with_nat(self, func, fill_value): datetime(2013, 1, 4), datetime(2013, 1, 5)] * 4 normal_grouped = normal_df.groupby('key') - dt_grouped = dt_df.groupby(TimeGrouper(key='key', freq='D')) + dt_grouped = dt_df.groupby(TimeGrouper(key='key', freq=freq)) normal_result = getattr(normal_grouped, func)() dt_result = getattr(dt_grouped, func)() @@ -3411,12 +3428,13 @@ def test_aggregate_with_nat(self, func, fill_value): columns=['A', 'B', 'C', 'D']) expected = normal_result.append(pad) expected = expected.sort_index() - expected.index = date_range(start='2013-01-01', freq='D', + expected.index = date_range(start='2013-01-01', freq=freq, periods=5, name='key') assert_frame_equal(expected, dt_result) assert dt_result.index.name == 'key' - def test_aggregate_with_nat_size(self): + @pytest.mark.parametrize('freq', ['CD', 'D']) + def test_aggregate_with_nat_size(self, freq): # GH 9925 n = 20 data = np.random.randn(n, 4).astype('int64') @@ -3428,7 +3446,7 @@ def test_aggregate_with_nat_size(self): datetime(2013, 1, 4), datetime(2013, 1, 5)] * 4 normal_grouped = normal_df.groupby('key') - dt_grouped = dt_df.groupby(TimeGrouper(key='key', freq='D')) + dt_grouped = dt_df.groupby(TimeGrouper(key='key', freq=freq)) normal_result = normal_grouped.size() dt_result = dt_grouped.size() @@ -3436,7 +3454,7 @@ def test_aggregate_with_nat_size(self): pad = Series([0], index=[3]) expected = normal_result.append(pad) expected = expected.sort_index() - expected.index = date_range(start='2013-01-01', freq='D', + expected.index = date_range(start='2013-01-01', freq=freq, periods=5, name='key') assert_series_equal(expected, dt_result) assert dt_result.index.name == 'key' diff --git a/pandas/tests/test_window.py b/pandas/tests/test_window.py index ec6d83062c8b0..ec4e37dce27cf 100644 --- a/pandas/tests/test_window.py +++ b/pandas/tests/test_window.py @@ -3491,16 +3491,18 @@ def test_frame_on2(self): result = df.rolling('2s', on='C')[['A', 'B', 'C']].sum() tm.assert_frame_equal(result, expected) - def test_basic_regular(self): + @pytest.mark.parametrize('freq', ['D', 'CD']) + def test_basic_regular(self, freq): df = self.regular.copy() - df.index = pd.date_range('20130101', periods=5, freq='D') + df.index = pd.date_range('20130101', periods=5, freq=freq) expected = df.rolling(window=1, min_periods=1).sum() result = df.rolling(window='1D').sum() tm.assert_frame_equal(result, expected) - df.index = pd.date_range('20130101', periods=5, freq='2D') + freq = '2' + freq + df.index = pd.date_range('20130101', periods=5, freq=freq) expected = df.rolling(window=1, min_periods=1).sum() result = df.rolling(window='2D', min_periods=1).sum() tm.assert_frame_equal(result, expected)