将“TimeStamp”列截断为pandas`DataFrame`中的小时精度

问题描述 投票:26回答:2

我有一个名为pandas.DataFramedf,它有一个自动生成的索引,列为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魔法来做到这一点?

python pandas datetime dataframe
2个回答
53
投票

在pandas 0.18.0及更高版本中,有日期时间floorceilround方法将时间戳舍入到给定的固定精度/频率。要向下舍入到小时精度,您可以使用:

>>> 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]'

2
投票

我过去用来实现这个目标的方法如下(与你已经在做的非常相似,但我想我还是把它扔出去了):

df['dt2'] = df['dt'].apply(lambda x: x.replace(minute=0, second=0))
© www.soinside.com 2019 - 2024. All rights reserved.