Skip to content

Commit 26e8fa8

Browse files
committed
Merge pull request #6575 from rosnfeld/issue_4553
ENH: including offset/freq in Timestamp repr (#4553)
2 parents b7dc475 + 92e813f commit 26e8fa8

File tree

3 files changed

+49
-6
lines changed

3 files changed

+49
-6
lines changed

doc/source/release.rst

+1
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ Improvements to existing features
150150
(e.g. MonthEnd,BusinessMonthEnd), (:issue:`6479`)
151151
- perf improvements in single-dtyped indexing (:issue:`6484`)
152152
- ``StataWriter`` and ``DataFrame.to_stata`` accept time stamp and data labels (:issue:`6545`)
153+
- offset/freq info now in Timestamp __repr__ (:issue:`4553`)
153154

154155
.. _release.bug_fixes-0.14.0:
155156

pandas/tseries/tests/test_tslib.py

+35
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,41 @@
1313
import pandas.util.testing as tm
1414

1515
class TestTimestamp(tm.TestCase):
16+
def test_repr(self):
17+
date = '2014-03-07'
18+
tz = 'US/Eastern'
19+
freq = 'M'
20+
21+
date_only = Timestamp(date)
22+
self.assertIn(date, repr(date_only))
23+
self.assertNotIn(tz, repr(date_only))
24+
self.assertNotIn(freq, repr(date_only))
25+
self.assertEqual(date_only, eval(repr(date_only)))
26+
27+
date_tz = Timestamp(date, tz=tz)
28+
self.assertIn(date, repr(date_tz))
29+
self.assertIn(tz, repr(date_tz))
30+
self.assertNotIn(freq, repr(date_tz))
31+
self.assertEqual(date_tz, eval(repr(date_tz)))
32+
33+
date_freq = Timestamp(date, offset=freq)
34+
self.assertIn(date, repr(date_freq))
35+
self.assertNotIn(tz, repr(date_freq))
36+
self.assertIn(freq, repr(date_freq))
37+
self.assertEqual(date_freq, eval(repr(date_freq)))
38+
39+
date_tz_freq = Timestamp(date, tz=tz, offset=freq)
40+
self.assertIn(date, repr(date_tz_freq))
41+
self.assertIn(tz, repr(date_tz_freq))
42+
self.assertIn(freq, repr(date_tz_freq))
43+
self.assertEqual(date_tz_freq, eval(repr(date_tz_freq)))
44+
45+
# this can cause the tz field to be populated, but it's redundant to information in the datestring
46+
date_with_utc_offset = Timestamp('2014-03-13 00:00:00-0400', tz=None)
47+
self.assertIn('2014-03-13 00:00:00-0400', repr(date_with_utc_offset))
48+
self.assertNotIn('tzoffset', repr(date_with_utc_offset))
49+
self.assertEqual(date_with_utc_offset, eval(repr(date_with_utc_offset)))
50+
1651
def test_bounds_with_different_units(self):
1752
out_of_bounds_dates = (
1853
'1677-09-21',

pandas/tslib.pyx

+13-6
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ cimport cython
3434

3535
from datetime import timedelta, datetime
3636
from datetime import time as datetime_time
37+
from dateutil.tz import tzoffset
3738
from pandas.compat import parse_date
3839

3940
from sys import version_info
@@ -183,6 +184,10 @@ class Timestamp(_Timestamp):
183184
if ts.value == NPY_NAT:
184185
return NaT
185186

187+
if util.is_string_object(offset):
188+
from pandas.tseries.frequencies import to_offset
189+
offset = to_offset(offset)
190+
186191
# make datetime happy
187192
ts_base = _Timestamp.__new__(cls, ts.dts.year, ts.dts.month,
188193
ts.dts.day, ts.dts.hour, ts.dts.min,
@@ -196,26 +201,28 @@ class Timestamp(_Timestamp):
196201
return ts_base
197202

198203
def __repr__(self):
199-
result = self._repr_base
204+
stamp = self._repr_base
200205
zone = None
201206

202207
try:
203-
result += self.strftime('%z')
208+
stamp += self.strftime('%z')
204209
if self.tzinfo:
205210
zone = _get_zone(self.tzinfo)
206211
except ValueError:
207212
year2000 = self.replace(year=2000)
208-
result += year2000.strftime('%z')
213+
stamp += year2000.strftime('%z')
209214
if self.tzinfo:
210215
zone = _get_zone(self.tzinfo)
211216

212217
try:
213-
result += zone.strftime(' %%Z')
218+
stamp += zone.strftime(' %%Z')
214219
except:
215220
pass
216-
zone = "'%s'" % zone if zone else 'None'
217221

218-
return "Timestamp('%s', tz=%s)" % (result, zone)
222+
tz = ", tz='{0}'".format(zone) if zone is not None and not isinstance(zone, tzoffset) else ""
223+
offset = ", offset='{0}'".format(self.offset.freqstr) if self.offset is not None else ""
224+
225+
return "Timestamp('{stamp}'{tz}{offset})".format(stamp=stamp, tz=tz, offset=offset)
219226

220227
@property
221228
def _date_repr(self):

0 commit comments

Comments
 (0)