小编典典

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

python

我有一个具有自动生成的索引的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巫术来做到这一点?


阅读 210

收藏
2020-12-20

共1个答案

小编典典

在熊猫和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,它支持截断精度到年或月。

您可以临时调整基础NumPydatetime64数据类型的精度单位,将其从更改[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]'
2020-12-20