2017-04-18 75 views
0

繼我對這篇文章的第一個問題,我仍然試圖改善我的代碼。時間槽搜索

爲了更好地表達自己,我的目標是找到距離給定日期最近的「時間段」。

「時間段」代表我的「工廠」的開放時間(因此排除週末和節假日)。


    Date   start_time    end_time  
    ----------------------------------------------------------------- 
2017-01-02 | 2017-01-02 07:00:00 2017-01-02 17:00:00 
2017-01-03 | 2017-01-03 07:00:00 2017-01-03 17:00:00  
2017-01-04 | 2017-01-04 07:00:00 2017-01-04 17:00:00 
2017-01-05 | 2017-01-05 08:00:00 2017-01-05 17:00:00 
2017-01-06 | 2017-01-06 08:00:00 2017-01-06 17:00:00 
2017-01-09 | 2017-01-09 08:00:00 2017-01-09 17:00:00 
    .....  |  ...... 

此數據存儲在一個740行表(這兩年我的開場白規劃時間表)

試圖保持它的簡單,我從客戶收到的訂單,並有檢查的時候,我可以執行它們。

例如,在'2017-01-02 10:00:00'上收到的訂單可以毫不拖延地處理。 在'2017-01-02 17:30'上收到的訂單將不得不等待'2017-01-03 07:00'待遇。

同樣,如果在週末收到訂單: '2017-01-07 17:30' - >'2017-01-09 07:00'

我要檢查上千份訂單定期優化算法,我期待這個尋找最好的方式。

我開始使用熊貓表來實現一個代碼,但它很慢(代碼如下)。

然後我使用numpy數組來加速(它工作正常),但它仍然很慢。

進一步在我的搜索我用sqlite但不是很好的結果。

因此,如果任何有經驗的建議可以給予它會有很大的幫助!

謝謝

PS:我盡我最大努力編輯這篇舊文章。希望它不會造成混淆......

我正在爲我的工廠建立一個生產計劃,我用Python和Pandas編寫了它。

我有一個熊貓DataFrame包含我的員工的工作時間(和工作日)。

Working hours

在另一方面,我有工作24/7機。

我在尋找的是建立一個函數,在給定的日期給我的日期,我的員工可以開始一個新的工作(也是當他的一天將完成)。 Infact機器可以在晚上停止生產,但必須等到第二天早上(或下一個開放日),直到有人可以啓動新的生產。

例如:

opening_hours(2017-04-06 04:00:00) -- > 2017-04-06 07:00:00, 2017-04-06 17:00:00 

opening_hours(2017-04-06 22:00:00) -- > 2017-04-06 07:00:00, 2017-04-06 17:00:00 

opening_hours(2017-04-07 22:00:00) -- > 2017-04-10 07:00:00, 2017-04-10 17:00:00 * 
*(because it is a weekend and the employee will be back on monday) 

到目前爲止,我寫了下面的功能,但它是非常緩慢:)

def opening_hours(x):
staff_working_time_start = df_staff_planning[df_staff_planning[u'Start time'] >= x][u'Start time'].min() staff_working_time_end = df_staff_planning[df_staff_planning[u'End time'] >= x][u'End time'].min() if staff_working_time_end <= staff_working_time_start: staff_working_time_start = x return staff_working_time_start, staff_working_time_end
該函數返回兩個一天的開始工作時間和結束時間。

可以用於評估幾個日期,但由於我爲我的計算做了大量的迭代(> 5000),所以速度很慢。

我感謝你在非常的幫助

回答

0

終於找到使用對開一個有趣的解決方案:

start = df_staff_planning[u'Start time'].tolist() 
end = df_staff_planning[u'End time'].tolist() 

def opening_hours_2(x): 
    staff_working_time_start = start[bisect.bisect(start, a)] 
    staff_working_time_end = end[bisect.bisect(end, a)] 
    if staff_working_time_end <= staff_working_time_start: 
     staff_working_time_start = x 

    return staff_working_time_start, staff_working_time_end 

它原來是75倍於我的問題的速度.. 。