Hill
Hill

Reputation: 3707

Reset time part of a pandas timestamp

How can I reset the time part of a pandas timestamp?

I want to reset time part in value of pandas.Timestamp.
I guess I can do it using the following procedure.

Even if my guess is correct, it takes too long to do. Is there a straightforward way to achieve this goal?

In [371]: ts = pd.Timestamp('2014/11/12 13:35')

In [372]: ts

Out[372]: Timestamp('2014-11-12 13:35:00')

In [373]: ts.hour = 0 # <-- this is what I am trying to do.

Upvotes: 24

Views: 50572

Answers (7)

Jacek Błocki
Jacek Błocki

Reputation: 563

If you have Timestamp then you can use pandas.Timestamp class to create new one with desired precision:

df['date' = df['date'].transform(lambda x: pd.Timestamp(x.year, x.month, x.day))

hour, minute, second can also be set, parameters not set explicitly get 0 value.

Upvotes: 0

AXO
AXO

Reputation: 9086

There is also Timestamp.floor:

>>> ts = pd.Timestamp('2014/11/12 13:35')
>>> ts.floor('D')
Timestamp('2014-11-12 00:00:00')
>>> ts.round('D')
Timestamp('2014-11-13 00:00:00')

But, on my machine, Timestamp.normalize is almost 30 times faster than floor, and Timestamp.replace is even faster than normalize:

>>> %timeit ts.replace(hour=0, minute=0, second=0)
1.23 µs ± 17.2 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
>>> %timeit ts.normalize()
2.18 µs ± 137 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)
>>> %timeit ts.floor('D')
62.7 µs ± 631 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

Upvotes: 2

George Parr
George Parr

Reputation: 1

I recommend using:

pd.Timestamp('2014-11-12 13:35')-pd.Timedelta(f"{pd.Timestamp('2014-11-12 13:35').hour} hours")

Upvotes: 0

Nadav Aharoni
Nadav Aharoni

Reputation: 191

Note that the replace method does not change the Timestamp, so if you want to keep the modified Timestamp you have to assign:

In [2]: ts = pd.Timestamp('2014/11/12 13:35')
In [3]: ts.replace(hour=0)
Out[3]: Timestamp('2014-11-12 00:35:00')
In [4]: ts
Out[4]: Timestamp('2014-11-12 13:35:00')

Note: ts is not modified in the code above.

In [5]: ts = ts.replace(hour=0)
In [6]: ts
Out[6]: Timestamp('2014-11-12 00:35:00')

Upvotes: 2

Andy Jones
Andy Jones

Reputation: 4941

pd.Timestamp('2014-11-12 13:35') - pd.offsets.Micro(0, normalize=True) == Timestamp('2014-11-12 00:00:00')

Upvotes: 0

joris
joris

Reputation: 139142

I think you are looking for the replace method (see docs):

In [18]: ts
Out[18]: Timestamp('2014-11-12 13:35:00')

In [19]: ts.replace(hour=0)
Out[19]: Timestamp('2014-11-12 00:35:00')

This is a method inherited from datetime.datetime

If you want to reset the full time part, you specify all parts in replace:

In [20]: ts.replace(hour=0, minute=0, second=0)
Out[20]: Timestamp('2014-11-12 00:00:00')

There is also a DatetimeIndex.normalize method, but this isn't available on the individual Timestamps (I opened an issue for that: https://github.com/pydata/pandas/issues/8794):

In [21]: pd.DatetimeIndex([ts]).normalize()[0]
Out[21]: Timestamp('2014-11-12 00:00:00')

Upvotes: 44

twasbrillig
twasbrillig

Reputation: 18821

Instead of using datetime.datetime, use datetime.date and it will automatically truncate the hour/minute/second for you.

See https://docs.python.org/library/datetime.html#date-objects

Upvotes: 1

Related Questions