将“ TimeStamp”列截断为pandas DataFrame中的小时精度
我有一个具有自动生成的索引的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
巫术来做到这一点?
-
在熊猫和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]
相同的方法应该适用于任何其他单位:months
'M'
,minutes'm'
等:- 保持一年:
'<M8[Y]'
- 持续到一个月:
'<M8[M]'
- 跟上一天:
'<M8[D]'
- 保持最新:
'<M8[m]'
- 跟上第二:
'<M8[s]'
- 保持一年: