Skip to content

Make Timestamp('now') equivalent to Timestamp.now() #9022

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Dec 7, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions doc/source/whatsnew/v0.15.2.txt
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,9 @@ API changes

- Allow equality comparisons of Series with a categorical dtype and object dtype; previously these would raise ``TypeError`` (:issue:`8938`)

- Timestamp('now') is now equivalent to Timestamp.now() in that it returns the local time rather than UTC. Also, Timestamp('today') is now
equivalent to Timestamp.today() and both have tz as a possible argument. (:issue:`9000`)

.. _whatsnew_0152.enhancements:

Enhancements
Expand Down
30 changes: 30 additions & 0 deletions pandas/tseries/tests/test_tslib.py
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,36 @@ def test_barely_oob_dts(self):
def test_utc_z_designator(self):
self.assertEqual(get_timezone(Timestamp('2014-11-02 01:00Z').tzinfo), 'UTC')

def test_now(self):
# #9000
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can you add a test with a tz (just for consistency)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

today() doesn't take a tz argument so I left that particular test out.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmm, if one is passed what should happen? raise?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well now that I think about it I see no reason why a tz shouldn't be an allowed argument. Maybe just have today() call now() and then we are done.

ts_from_string = Timestamp('now')
ts_from_method = Timestamp.now()
ts_datetime = datetime.datetime.now()

ts_from_string_tz = Timestamp('now', tz='US/Eastern')
ts_from_method_tz = Timestamp.now(tz='US/Eastern')

# Check that the delta between the times is less than 1s (arbitrarily small)
delta = Timedelta(seconds=1)
self.assertTrue((ts_from_method - ts_from_string) < delta)
self.assertTrue((ts_from_method_tz - ts_from_string_tz) < delta)
self.assertTrue((ts_from_string_tz.tz_localize(None) - ts_from_string) < delta)

def test_today(self):

ts_from_string = Timestamp('today')
ts_from_method = Timestamp.today()
ts_datetime = datetime.datetime.today()

ts_from_string_tz = Timestamp('today', tz='US/Eastern')
ts_from_method_tz = Timestamp.today(tz='US/Eastern')

# Check that the delta between the times is less than 1s (arbitrarily small)
delta = Timedelta(seconds=1)
self.assertTrue((ts_from_method - ts_from_string) < delta)
self.assertTrue((ts_datetime - ts_from_method) < delta)
self.assertTrue((ts_datetime - ts_from_method) < delta)
self.assertTrue((ts_from_string_tz.tz_localize(None) - ts_from_string) < delta)

class TestDatetimeParsingWrappers(tm.TestCase):
def test_does_not_convert_mixed_integer(self):
Expand Down
37 changes: 31 additions & 6 deletions pandas/tslib.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -173,9 +173,9 @@ def ints_to_pytimedelta(ndarray[int64_t] arr, box=False):
result[i] = NaT
else:
if box:
result[i] = Timedelta(value)
result[i] = Timedelta(value)
else:
result[i] = timedelta(microseconds=int(value)/1000)
result[i] = timedelta(microseconds=int(value)/1000)

return result

Expand Down Expand Up @@ -216,15 +216,32 @@ class Timestamp(_Timestamp):

@classmethod
def now(cls, tz=None):
""" compat now with datetime """
"""
Return the current time in the local timezone. Equivalent
to datetime.now([tz])

Parameters
----------
tz : string / timezone object, default None
Timezone to localize to
"""
if isinstance(tz, basestring):
tz = maybe_get_tz(tz)
return cls(datetime.now(tz))

@classmethod
def today(cls):
""" compat today with datetime """
return cls(datetime.today())
def today(cls, tz=None):
"""
Return the current time in the local timezone. This differs
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This docstring needs an update now (and should probably be the same as the one for today).

from datetime.today() in that it can be localized to a
passed timezone.

Parameters
----------
tz : string / timezone object, default None
Timezone to localize to
"""
return cls.now(tz)

@classmethod
def utcnow(cls):
Expand Down Expand Up @@ -1021,6 +1038,14 @@ cdef convert_to_tsobject(object ts, object tz, object unit):
if util.is_string_object(ts):
if ts in _nat_strings:
ts = NaT
elif ts == 'now':
# Issue 9000, we short-circuit rather than going
# into np_datetime_strings which returns utc
ts = Timestamp.now(tz)
elif ts == 'today':
# Issue 9000, we short-circuit rather than going
# into np_datetime_strings which returns a normalized datetime
ts = Timestamp.today(tz)
else:
try:
_string_to_dts(ts, &obj.dts, &out_local, &out_tzoffset)
Expand Down