2017-10-11 110 views
0

我有一個包含類似這樣的事件數據框:拆分數據幀由行日期時間在大熊貓

location start_time end_time  some_value1 some_value2 
LECP  00:00  01:30  25   nice info 
LECP  02:00  04:00  10   other info 
LECS  02:00  03:00   5   lorem 
LIPM  02:55  03:15   9   ipsum 

,我想,這樣我得到的最大1 hour間隔,例如分裂行如果一個事件的持續時間爲01:30,我想獲得一行長度爲01:00,另一個爲00:30。如果一個事件的長度爲02:30,我想得到三行。如果一個事件持續一個小時或更少,它應該保持一行。像這樣:

location start_time end_time some_value1 some_value2 
LECP  00:00  01:00  25   nice info 
LECP  01:00  01:30  25   nice info 

LECP  02:00  03:00  10   other info 
LECP  03:00  04:00  10   other info 

LECS  02:00  03:00  5   lorem 
LIPM  02:55  03:15  9   ipsum 

如果餘數在開始或結束時無關緊要。如果持續時間平均分配給行,則無關緊要,只要沒有行的持續時間大於1小時即可。

我試過的東西: - 通過Time Series/Date functionality閱讀並不理解任何東西 - 正在搜索StackOverflow。

+0

這是因爲這些是獨立事件。一些事件可能發生在相同或不同的地方,在相同或不同的時間 – Ulu83

+0

呃......對不起。我的問題是在你的預期結果中,如果第二條記錄從01:00開始而不是00:00? –

+0

我的不好。是的,你的解釋是對的。編輯OP。 – Ulu83

回答

0

我改編this答案實施每小時而不是每日拆分。這段代碼在WHIL循環中工作,所以只要有持續時間> 1小時的行,它就會重新迭代。

mytimedelta = pd.Timedelta('1 hour') 

#create boolean mask 
split_rows = (dfob['duration'] > mytimedelta)  

while split_rows.any(): 
    #get new rows to append and adjust start time to 1 hour later. 
    new_rows = dfob[split_rows].copy() 
    new_rows['start'] = new_rows['start'] + mytimedelta 

    #update the end time of old rows 
    dfob.loc[split_rows, 'end'] = dfob.loc[split_rows, 'start'] + \ 
     pd.DateOffset(hours=1, seconds=-1) 
    dfob = dfob.append(new_rows) 

    #update the duration of all rows 
    dfob['duration'] = dfob['end'] - dfob['start'] 

    #create an updated boolean mask 
    split_rows = (dfob['duration'] > mytimedelta) 

#when job is done: 
dfob.sort_index().reset_index(drop=True) 
dfob['duration'] = dfob['end'] - dfob['start']