這裏是一個溶液。它可能不是最優的,但它似乎工作得很好。當然,我已經生成了自己的數據,並假定用戶從零開始運行程序。
import pandas as pd
import datetime as dt
#Generate some data
m = 50
n = 2 * m
start_time = [dt.datetime(2016, 12, 17, 3, np.random.randint(0, 59)) for n in range(n)]
df = pd.DataFrame({'start_time': start_time,
'end_time': [date + dt.timedelta(0, np.random.randint(0, 3600)) for date in start_time],
'user': ['A', 'E'] * (m)})
#Doing the solution
user_on = (df.ix[:, ['end_time', 'user']]
.rename(columns={'end_time':'time'})
.assign(on_off=-1))
user_off = (df.ix[:, ['start_time', 'user']]
.rename(columns={'start_time':'time'})
.assign(on_off=1))
df = pd.concat([user_on, user_off]).sort_values(by='time')
df = df.groupby(['time', 'user']).sum()
df = df.unstack().cumsum().fillna(method='ffill')
下面是表格輸出的一個例子。
on_off
user A E
time
2016-12-17 03:00:00 1 0
2016-12-17 03:01:00 2 1
2016-12-17 03:02:00 2 2
2016-12-17 03:03:00 4 4
2016-12-17 03:04:00 5 3
2016-12-17 03:06:00 7 4
比較倍這場耗時82MS做10,000個樣本,包括生成數據。
下圖顯示了隨時間變化的用戶程序總數(藍色和綠色)以及任何給定時間(紅色和紫色)運行程序的變化(開啓 - 關閉)。
注:在這種情況下,我假設一個用戶可以開始在給定的時間標記多個程序。這只是我產生測試日期的結果。
新數據框應該使用哪些時間值作爲索引,所有開始/結束時間的組合還是某些常規間隔? – FTP
理想情況下,我將能夠做到這一點。 – ajwood