我有一个名为pandas.DataFrame
的df
,它有一个自动生成的索引,列为dt
:
df['dt'].dtype, df['dt'][0]
# (dtype('<M8[ns]'), Timestamp('2014-10-01 10:02:45'))
我想要做的是创建一个截断为小时精度的新列。我目前正在使用:
df['dt2'] = df['dt'].apply(lambda L: datetime(L.year, L.month, L.day, L.hour))
这很有效,所以没关系。但是,我有一个很好的方式使用pandas.tseries.offsets
或创建一个DatetimeIndex
或类似的。
所以,如果可能的话,是否有一些pandas
魔法来做到这一点?
在pandas 0.18.0及更高版本中,有日期时间floor
,ceil
和round
方法将时间戳舍入到给定的固定精度/频率。要向下舍入到小时精度,您可以使用:
>>> 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
这是截断时间戳的另一种方法。与floor
不同,它支持截断到精确度,如年或月。
您可以临时调整基础NumPy datetime64
数据类型的精度单位,将其从[ns]
更改为[h]
:
df['dt'].values.astype('<M8[h]')
这会将所有内容截断为小时精度。例如:
>>> 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]
同样的方法适用于任何其他单位:月'M'
,分钟'm'
,等等:
'<M8[Y]'
'<M8[M]'
'<M8[D]'
'<M8[m]'
'<M8[s]'
我过去用来实现这个目标的方法如下(与你已经在做的非常相似,但我想我还是把它扔出去了):
df['dt2'] = df['dt'].apply(lambda x: x.replace(minute=0, second=0))