簡體   English   中英

將“TimeStamp”列截斷為pandas`DataFrame`中的小時精度

[英]Truncate `TimeStamp` column to hour precision in pandas `DataFrame`

我有一個名為dfpandas.DataFrame ,它有一個自動生成的索引,列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及更高版本中,有datetime 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]'

我過去用來實現這個目標的方法如下(與你已經在做的非常相似,但我想我還是把它扔出去了):

df['dt2'] = df['dt'].apply(lambda x: x.replace(minute=0, second=0))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM