I have a pandas.DataFrame
called df
which has an automatically generated index, with a column dt
:
df['dt'].dtype, df['dt'][0] # (dtype('<M8[ns]'), Timestamp('2014-10-01 10:02:45'))
What I'd like to do is create a new column truncated to hour precision. I'm currently using:
df['dt2'] = df['dt'].apply(lambda L: datetime(L.year, L.month, L.day, L.hour))
This works, so that's fine. However, I've an inkling there's some nice way using pandas.tseries.offsets
or creating a DatetimeIndex
or similar.
So if possible, is there some pandas
wizardry to do this?
tz_localize(None) method can be applied to the dataframe column to remove the timezone information.
In pandas 0.18.0 and later, there are datetime floor
, ceil
and round
methods to round timestamps to a given fixed precision/frequency. To round down to hour precision, you can use:
>>> df['dt2'] = df['dt'].dt.floor('h') >>> df dt dt2 0 2014-10-01 10:02:45 2014-10-01 10:00:00 1 2014-10-01 13:08:17 2014-10-01 13:00:00 2 2014-10-01 17:39:24 2014-10-01 17:00:00
Here's another alternative to truncate the timestamps. Unlike floor
, it supports truncating to a precision such as year or month.
You can temporarily adjust the precision unit of the underlying NumPy datetime64
datatype, changing it from [ns]
to [h]
:
df['dt'].values.astype('<M8[h]')
This truncates everything to hour precision. For example:
>>> df dt 0 2014-10-01 10:02:45 1 2014-10-01 13:08:17 2 2014-10-01 17:39:24 >>> df['dt2'] = df['dt'].values.astype('<M8[h]') >>> df dt dt2 0 2014-10-01 10:02:45 2014-10-01 10:00:00 1 2014-10-01 13:08:17 2014-10-01 13:00:00 2 2014-10-01 17:39:24 2014-10-01 17:00:00 >>> df.dtypes dt datetime64[ns] dt2 datetime64[ns]
The same method should work for any other unit: months 'M'
, minutes 'm'
, and so on:
'<M8[Y]'
'<M8[M]'
'<M8[D]'
'<M8[m]'
'<M8[s]'
A method I've used in the past to accomplish this goal was the following (quite similar to what you're already doing, but thought I'd throw it out there anyway):
df['dt2'] = df['dt'].apply(lambda x: x.replace(minute=0, second=0))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With