diff --git a/pandas/core/groupby.py b/pandas/core/groupby.py index 967685c4e11bf..f9ac0e67fcf05 100644 --- a/pandas/core/groupby.py +++ b/pandas/core/groupby.py @@ -9,7 +9,7 @@ from pandas.compat import ( zip, range, lzip, - callable, map + callable, map, signature ) from pandas import compat @@ -234,6 +234,8 @@ class Grouper(object): >>> df.groupby(Grouper(level='date', freq='60s', axis=1)) """ + _attributes = ['key', 'level', 'freq', 'axis', 'sort'] + def __new__(cls, *args, **kwargs): if kwargs.get('freq') is not None: from pandas.core.resample import TimeGrouper @@ -333,6 +335,17 @@ def _set_grouper(self, obj, sort=False): def groups(self): return self.grouper.groups + def __repr__(self): + grouper_defaults = compat.signature(self.__init__).defaults + sd = self.__dict__ + attrs = collections.OrderedDict() + for k, v in zip(self._attributes, grouper_defaults): + if k in sd and sd[k] != v: + attrs[k] = sd[k] + attrs = ", ".join("{}={!r}".format(k, v) for k, v in attrs.items()) + cls_name = self.__class__.__name__ + return "{}({})".format(cls_name, attrs) + class GroupByPlot(PandasObject): """ diff --git a/pandas/core/resample.py b/pandas/core/resample.py index 5a571f9077999..56402ea979255 100644 --- a/pandas/core/resample.py +++ b/pandas/core/resample.py @@ -1,4 +1,5 @@ from datetime import timedelta +import collections import numpy as np import warnings import copy @@ -1026,13 +1027,18 @@ class TimeGrouper(Grouper): directly from the associated object """ + _attributes = ['key', 'level', 'freq', 'axis', 'sort', 'closed', 'label', + 'how', 'nperiods', 'fill_method', 'limit', + 'loffset', 'kind', 'convention', 'base'] + _end_types = {'M', 'A', 'Q', 'BM', 'BA', 'BQ', 'W'} + def __init__(self, freq='Min', closed=None, label=None, how='mean', nperiods=None, axis=0, fill_method=None, limit=None, loffset=None, kind=None, convention=None, base=0, **kwargs): freq = to_offset(freq) - end_types = set(['M', 'A', 'Q', 'BM', 'BA', 'BQ', 'W']) + end_types = self._end_types rule = freq.rule_code if (rule in end_types or ('-' in rule and rule[:rule.find('-')] in end_types)): @@ -1047,6 +1053,7 @@ def __init__(self, freq='Min', closed=None, label=None, how='mean', label = 'left' self.closed = closed + self.freq = freq self.label = label self.nperiods = nperiods self.kind = kind diff --git a/pandas/tests/test_resample.py b/pandas/tests/test_resample.py index ba1a2ad1f42e2..ff012c75e1531 100644 --- a/pandas/tests/test_resample.py +++ b/pandas/tests/test_resample.py @@ -3177,6 +3177,14 @@ def setup_method(self, method): self.ts = Series(np.random.randn(1000), index=date_range('1/1/2000', periods=1000)) + def test_timegrouper_repr(self): + # Added in GH17727 + result = repr(TimeGrouper(key='key', freq='50Min', label='right')) + expected = ("TimeGrouper(key='key', freq=<50 * Minutes>, axis=0," + " sort=True, closed='left', label='right', how='mean', " + "loffset=None)") + assert result == expected + def test_apply(self): with tm.assert_produces_warning(FutureWarning, check_stacklevel=False):