关于这篇文章的第一个问题,我仍然在努力改进我的代码。
为了更好地表达自己,我的目标是找到距离给定日期最近的“时间段”。
“时间段”表示我的“工厂”的开放时间(因此不包括周末和假日)。
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'
我必须在优化算法中定期检查数千个订单,我正在寻找最佳的搜索方式。
我开始使用Panda表实现代码,但速度很慢(下面的代码)。
然后我使用numpy数组加速(并且它工作正常)但它仍然很慢。
在我的搜索中更进一步,我使用的是sqlite但效果不佳。
因此,如果有任何经验丰富的建议,那将会有很大的帮助!
由于
PS:我尽力编辑这篇旧帖子。希望它不会混淆......
我正在为我的工厂建立一个生产计划,我用Python和Pandas编写了它。
我有一个Pandas DataFrame,其中包含我员工的工作时间(以及工作日)。
另一方面,我的机器全天候工作。
我正在寻找的是建立一个功能,在给定日期给出我的员工可以开始新工作的日期(以及他的一天结束时)。 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 :(得分:0)
终于找到了一个使用bisect的有趣解决方案:
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倍......