Skip to content

Commit f481283

Browse files
committed
Merge pull request #9116 from sinhrks/dt_summary
API: Datetime-like indexes `summary` should output the same format
2 parents 3afd6c7 + 9dd77d5 commit f481283

File tree

6 files changed

+124
-52
lines changed

6 files changed

+124
-52
lines changed

doc/source/whatsnew/v0.16.0.txt

+4
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ Backwards incompatible API changes
4545
In [2]: pd.DataFrame({'i': [1,2], 'f': [3.0, 4.2]}).to_json()
4646
Out[2]: '{"f":{"0":3.0,"1":4.2},"i":{"0":1,"1":2}}'
4747

48+
- ``DatetimeIndex``, ``PeriodIndex`` and ``TimedeltaIndex.summary`` now output the same format. (:issue:`9116`)
49+
- ``TimedeltaIndex.freqstr`` now output the same string format as ``DatetimeIndex``. (:issue:`9116`)
50+
51+
4852
Deprecations
4953
~~~~~~~~~~~~
5054

pandas/tseries/base.py

+27
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,13 @@ def __contains__(self, key):
6969
except (KeyError, TypeError):
7070
return False
7171

72+
@property
73+
def freqstr(self):
74+
""" return the frequency object as a string if its set, otherwise None """
75+
if self.freq is None:
76+
return None
77+
return self.freq.freqstr
78+
7279
@cache_readonly
7380
def inferred_freq(self):
7481
try:
@@ -459,3 +466,23 @@ def repeat(self, repeats, axis=None):
459466
"""
460467
return self._simple_new(self.values.repeat(repeats),
461468
name=self.name)
469+
470+
def summary(self, name=None):
471+
"""
472+
return a summarized representation
473+
"""
474+
formatter = self._formatter_func
475+
if len(self) > 0:
476+
index_summary = ', %s to %s' % (formatter(self[0]),
477+
formatter(self[-1]))
478+
else:
479+
index_summary = ''
480+
481+
if name is None:
482+
name = type(self).__name__
483+
result = '%s: %s entries%s' % (com.pprint_thing(name),
484+
len(self), index_summary)
485+
if self.freq:
486+
result += '\nFreq: %s' % self.freqstr
487+
488+
return result

pandas/tseries/index.py

-23
Original file line numberDiff line numberDiff line change
@@ -682,22 +682,6 @@ def _format_native_types(self, na_rep=u('NaT'),
682682
def to_datetime(self, dayfirst=False):
683683
return self.copy()
684684

685-
def summary(self, name=None):
686-
if len(self) > 0:
687-
index_summary = ', %s to %s' % (com.pprint_thing(self[0]),
688-
com.pprint_thing(self[-1]))
689-
else:
690-
index_summary = ''
691-
692-
if name is None:
693-
name = type(self).__name__
694-
result = '%s: %s entries%s' % (com.pprint_thing(name),
695-
len(self), index_summary)
696-
if self.freq:
697-
result += '\nFreq: %s' % self.freqstr
698-
699-
return result
700-
701685
def _format_footer(self):
702686
tagline = 'Length: %d, Freq: %s, Timezone: %s'
703687
return tagline % (len(self), self.freqstr, self.tz)
@@ -1392,13 +1376,6 @@ def _set_freq(self, value):
13921376
self.offset = value
13931377
freq = property(fget=_get_freq, fset=_set_freq, doc="get/set the frequncy of the Index")
13941378

1395-
@property
1396-
def freqstr(self):
1397-
""" return the frequency object as a string if its set, otherwise None """
1398-
if self.freq is None:
1399-
return None
1400-
return self.offset.freqstr
1401-
14021379
year = _field_accessor('year', 'Y', "The year of the datetime")
14031380
month = _field_accessor('month', 'M', "The month as January=1, December=12")
14041381
day = _field_accessor('day', 'D', "The days of the datetime")

pandas/tseries/tdi.py

-24
Original file line numberDiff line numberDiff line change
@@ -410,23 +410,6 @@ def f(x):
410410
result = result.astype('int64')
411411
return result
412412

413-
def summary(self, name=None):
414-
formatter = self._formatter_func
415-
if len(self) > 0:
416-
index_summary = ', %s to %s' % (formatter(self[0]),
417-
formatter(self[-1]))
418-
else:
419-
index_summary = ''
420-
421-
if name is None:
422-
name = type(self).__name__
423-
result = '%s: %s entries%s' % (com.pprint_thing(name),
424-
len(self), index_summary)
425-
if self.freq:
426-
result += '\nFreq: %s' % self.freqstr
427-
428-
return result
429-
430413
def to_pytimedelta(self):
431414
"""
432415
Return TimedeltaIndex as object ndarray of datetime.timedelta objects
@@ -796,13 +779,6 @@ def __getitem__(self, key):
796779

797780
return self._simple_new(result, self.name)
798781

799-
@property
800-
def freqstr(self):
801-
""" return the frequency object as a string if its set, otherwise None """
802-
if self.freq is None:
803-
return None
804-
return self.freq
805-
806782
def searchsorted(self, key, side='left'):
807783
if isinstance(key, (np.ndarray, Index)):
808784
key = np.array(key, dtype=_TD_DTYPE, copy=False)

pandas/tseries/tests/test_base.py

+92-4
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,34 @@ def test_representation(self):
143143
result = getattr(idx, func)()
144144
self.assertEqual(result, expected)
145145

146+
def test_summary(self):
147+
# GH9116
148+
idx1 = DatetimeIndex([], freq='D')
149+
idx2 = DatetimeIndex(['2011-01-01'], freq='D')
150+
idx3 = DatetimeIndex(['2011-01-01', '2011-01-02'], freq='D')
151+
idx4 = DatetimeIndex(['2011-01-01', '2011-01-02', '2011-01-03'], freq='D')
152+
idx5 = DatetimeIndex(['2011-01-01 09:00', '2011-01-01 10:00', '2011-01-01 11:00'],
153+
freq='H', tz='Asia/Tokyo')
154+
idx6 = DatetimeIndex(['2011-01-01 09:00', '2011-01-01 10:00', pd.NaT],
155+
tz='US/Eastern')
156+
157+
exp1 = """DatetimeIndex: 0 entries
158+
Freq: D"""
159+
exp2 = """DatetimeIndex: 1 entries, 2011-01-01 to 2011-01-01
160+
Freq: D"""
161+
exp3 = """DatetimeIndex: 2 entries, 2011-01-01 to 2011-01-02
162+
Freq: D"""
163+
exp4 = """DatetimeIndex: 3 entries, 2011-01-01 to 2011-01-03
164+
Freq: D"""
165+
exp5 = """DatetimeIndex: 3 entries, 2011-01-01 09:00:00+09:00 to 2011-01-01 11:00:00+09:00
166+
Freq: H"""
167+
exp6 = """DatetimeIndex: 3 entries, 2011-01-01 09:00:00-05:00 to NaT"""
168+
169+
for idx, expected in zip([idx1, idx2, idx3, idx4, idx5, idx6],
170+
[exp1, exp2, exp3, exp4, exp5, exp6]):
171+
result = idx.summary()
172+
self.assertEqual(result, expected)
173+
146174
def test_resolution(self):
147175
for freq, expected in zip(['A', 'Q', 'M', 'D', 'H', 'T', 'S', 'L', 'U'],
148176
['day', 'day', 'day', 'day',
@@ -336,16 +364,16 @@ def test_representation(self):
336364

337365

338366
exp1 = """<class 'pandas.tseries.tdi.TimedeltaIndex'>
339-
Length: 0, Freq: <Day>"""
367+
Length: 0, Freq: D"""
340368
exp2 = """<class 'pandas.tseries.tdi.TimedeltaIndex'>
341369
['1 days']
342-
Length: 1, Freq: <Day>"""
370+
Length: 1, Freq: D"""
343371
exp3 = """<class 'pandas.tseries.tdi.TimedeltaIndex'>
344372
['1 days', '2 days']
345-
Length: 2, Freq: <Day>"""
373+
Length: 2, Freq: D"""
346374
exp4 = """<class 'pandas.tseries.tdi.TimedeltaIndex'>
347375
['1 days', ..., '3 days']
348-
Length: 3, Freq: <Day>"""
376+
Length: 3, Freq: D"""
349377
exp5 = """<class 'pandas.tseries.tdi.TimedeltaIndex'>
350378
['1 days 00:00:01', ..., '3 days 00:00:00']
351379
Length: 3, Freq: None"""
@@ -356,6 +384,29 @@ def test_representation(self):
356384
result = getattr(idx, func)()
357385
self.assertEqual(result, expected)
358386

387+
def test_summary(self):
388+
# GH9116
389+
idx1 = TimedeltaIndex([], freq='D')
390+
idx2 = TimedeltaIndex(['1 days'], freq='D')
391+
idx3 = TimedeltaIndex(['1 days', '2 days'], freq='D')
392+
idx4 = TimedeltaIndex(['1 days', '2 days', '3 days'], freq='D')
393+
idx5 = TimedeltaIndex(['1 days 00:00:01', '2 days', '3 days'])
394+
395+
exp1 = """TimedeltaIndex: 0 entries
396+
Freq: D"""
397+
exp2 = """TimedeltaIndex: 1 entries, '1 days' to '1 days'
398+
Freq: D"""
399+
exp3 = """TimedeltaIndex: 2 entries, '1 days' to '2 days'
400+
Freq: D"""
401+
exp4 = """TimedeltaIndex: 3 entries, '1 days' to '3 days'
402+
Freq: D"""
403+
exp5 = """TimedeltaIndex: 3 entries, '1 days 00:00:01' to '3 days 00:00:00'"""
404+
405+
for idx, expected in zip([idx1, idx2, idx3, idx4, idx5],
406+
[exp1, exp2, exp3, exp4, exp5]):
407+
result = idx.summary()
408+
self.assertEqual(result, expected)
409+
359410
def test_add_iadd(self):
360411

361412
# only test adding/sub offsets as + is now numeric
@@ -755,6 +806,43 @@ def test_representation(self):
755806
result = getattr(idx, func)()
756807
self.assertEqual(result, expected)
757808

809+
def test_summary(self):
810+
# GH9116
811+
idx1 = PeriodIndex([], freq='D')
812+
idx2 = PeriodIndex(['2011-01-01'], freq='D')
813+
idx3 = PeriodIndex(['2011-01-01', '2011-01-02'], freq='D')
814+
idx4 = PeriodIndex(['2011-01-01', '2011-01-02', '2011-01-03'], freq='D')
815+
idx5 = PeriodIndex(['2011', '2012', '2013'], freq='A')
816+
idx6 = PeriodIndex(['2011-01-01 09:00', '2012-02-01 10:00', 'NaT'], freq='H')
817+
818+
idx7 = pd.period_range('2013Q1', periods=1, freq="Q")
819+
idx8 = pd.period_range('2013Q1', periods=2, freq="Q")
820+
idx9 = pd.period_range('2013Q1', periods=3, freq="Q")
821+
822+
exp1 = """PeriodIndex: 0 entries
823+
Freq: D"""
824+
exp2 = """PeriodIndex: 1 entries, 2011-01-01 to 2011-01-01
825+
Freq: D"""
826+
exp3 = """PeriodIndex: 2 entries, 2011-01-01 to 2011-01-02
827+
Freq: D"""
828+
exp4 = """PeriodIndex: 3 entries, 2011-01-01 to 2011-01-03
829+
Freq: D"""
830+
exp5 = """PeriodIndex: 3 entries, 2011 to 2013
831+
Freq: A-DEC"""
832+
exp6 = """PeriodIndex: 3 entries, 2011-01-01 09:00 to NaT
833+
Freq: H"""
834+
exp7 = """PeriodIndex: 1 entries, 2013Q1 to 2013Q1
835+
Freq: Q-DEC"""
836+
exp8 = """PeriodIndex: 2 entries, 2013Q1 to 2013Q2
837+
Freq: Q-DEC"""
838+
exp9 = """PeriodIndex: 3 entries, 2013Q1 to 2013Q3
839+
Freq: Q-DEC"""
840+
841+
for idx, expected in zip([idx1, idx2, idx3, idx4, idx5, idx6, idx7, idx8, idx9],
842+
[exp1, exp2, exp3, exp4, exp5, exp6, exp7, exp8, exp9]):
843+
result = idx.summary()
844+
self.assertEqual(result, expected)
845+
758846
def test_resolution(self):
759847
for freq, expected in zip(['A', 'Q', 'M', 'D', 'H', 'T', 'S', 'L', 'U'],
760848
['day', 'day', 'day', 'day',

pandas/tseries/tests/test_timedeltas.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -540,7 +540,7 @@ def conv(v):
540540
expected = np.array([0, 500000000, 800000000, 1200000000], dtype='timedelta64[ns]')
541541
result = to_timedelta([0., 0.5, 0.8, 1.2], unit='s', box=False)
542542
tm.assert_numpy_array_equal(expected, result)
543-
543+
544544
def testit(unit, transform):
545545

546546
# array

0 commit comments

Comments
 (0)