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

发布于 2021-01-29 18:30:18

我有一个具有自动生成的索引的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
被浏览
53
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    在熊猫和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]'


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看