[英]Truncate `TimeStamp` column to hour precision in pandas `DataFrame`
我有一個名為df
的pandas.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 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]
同樣的方法適用於任何其他單位:月'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.