Skip to content

Commit

Permalink
Making to_datetime('today') and Timestamp('today') consistent (#19937)
Browse files Browse the repository at this point in the history
  • Loading branch information
shangyian authored and jreback committed Mar 1, 2018
1 parent 87fefe2 commit d44a6ec
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 8 deletions.
1 change: 1 addition & 0 deletions doc/source/whatsnew/v0.23.0.txt
Original file line number Diff line number Diff line change
Expand Up @@ -652,6 +652,7 @@ Other API Changes
- Set operations (union, difference...) on :class:`IntervalIndex` with incompatible index types will now raise a ``TypeError`` rather than a ``ValueError`` (:issue:`19329`)
- :class:`DateOffset` objects render more simply, e.g. ``<DateOffset: days=1>`` instead of ``<DateOffset: kwds={'days': 1}>`` (:issue:`19403`)
- ``Categorical.fillna`` now validates its ``value`` and ``method`` keyword arguments. It now raises when both or none are specified, matching the behavior of :meth:`Series.fillna` (:issue:`19682`)
- ``pd.to_datetime('today')`` now returns a datetime, consistent with ``pd.Timestamp('today')``; previously ``pd.to_datetime('today')`` returned a ``.normalized()`` datetime (:issue:`19935`)
- :func:`Series.str.replace` now takes an optional `regex` keyword which, when set to ``False``, uses literal string replacement rather than regex replacement (:issue:`16808`)

.. _whatsnew_0230.deprecations:
Expand Down
3 changes: 1 addition & 2 deletions pandas/_libs/tslib.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -755,8 +755,7 @@ cdef inline bint _parse_today_now(str val, int64_t* iresult):
iresult[0] = Timestamp.utcnow().value
return True
elif val == 'today':
# Note: this is *not* the same as Timestamp('today')
iresult[0] = Timestamp.now().normalize().value
iresult[0] = Timestamp.today().value
return True
return False

Expand Down
19 changes: 13 additions & 6 deletions pandas/tests/indexes/datetimes/test_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -224,27 +224,34 @@ def test_to_datetime_today(self):
# this both of these timezones _and_ UTC will all be in the same day,
# so this test will not detect the regression introduced in #18666.
with tm.set_timezone('Pacific/Auckland'): # 12-13 hours ahead of UTC
nptoday = np.datetime64('today').astype('datetime64[ns]')
nptoday = np.datetime64('today')\
.astype('datetime64[ns]').astype(np.int64)
pdtoday = pd.to_datetime('today')
pdtoday2 = pd.to_datetime(['today'])[0]

tstoday = pd.Timestamp('today')
tstoday2 = pd.Timestamp.today()

# These should all be equal with infinite perf; this gives
# a generous margin of 10 seconds
assert abs(pdtoday.value - nptoday.astype(np.int64)) < 1e10
assert abs(pdtoday2.value - nptoday.astype(np.int64)) < 1e10
assert abs(pdtoday.normalize().value - nptoday) < 1e10
assert abs(pdtoday2.normalize().value - nptoday) < 1e10
assert abs(pdtoday.value - tstoday.value) < 1e10
assert abs(pdtoday.value - tstoday2.value) < 1e10

assert pdtoday.tzinfo is None
assert pdtoday2.tzinfo is None

with tm.set_timezone('US/Samoa'): # 11 hours behind UTC
nptoday = np.datetime64('today').astype('datetime64[ns]')
nptoday = np.datetime64('today')\
.astype('datetime64[ns]').astype(np.int64)
pdtoday = pd.to_datetime('today')
pdtoday2 = pd.to_datetime(['today'])[0]

# These should all be equal with infinite perf; this gives
# a generous margin of 10 seconds
assert abs(pdtoday.value - nptoday.astype(np.int64)) < 1e10
assert abs(pdtoday2.value - nptoday.astype(np.int64)) < 1e10
assert abs(pdtoday.normalize().value - nptoday) < 1e10
assert abs(pdtoday2.normalize().value - nptoday) < 1e10

assert pdtoday.tzinfo is None
assert pdtoday2.tzinfo is None
Expand Down

0 comments on commit d44a6ec

Please sign in to comment.