我有一個包含特定時間戳的資料框,即特定事件的專案數。
matrix = pd.DataFrame()
matrix['Timestamp'] = [Timestamp('2019-12-01 11:25:32.060000'),
Timestamp('2019-12-01 15:24:38.527000'),
Timestamp('2019-12-02 17:09:57.907000'),
Timestamp('2019-12-02 18:06:38.883000'),
Timestamp('2019-12-02 19:16:43.667000'),
Timestamp('2019-12-03 20:59:10.727000')]
matrix['N° Items'] = [1,2,1,4,5,7]
matrix

我想為每一行計算過去 30 分鐘內專案數的總和。我解決了以下問題:
def in_Range(delta):
seconds = delta.total_seconds()
return (seconds>0) and (seconds<60*30)
def func(ts):
return matrix[(ts-matrix['Timestamp']).apply(in_Range)]['N° Items'].sum()
matrix['N° Items Last 30 Minutes'] = matrix['Timestamp'].apply(func)
我想知道是否有其他(希望是更好的)方法來解決這個問題。這個解決方案非常慢(即使使用多處理)而且我的真實資料框很大。
uj5u.com熱心網友回復:
DataFrame.rolling就是你要找的。該函式僅在您的資料框的索引是時間戳系列時才有效:
result = (
matrix.set_index("Timestamp")
.assign(**{
"N° Items Last 30 Minutes": lambda x: x["N° Items"].rolling("30T").sum() - x["N° Items"]
})
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/443049.html
