时隙搜索

2024-04-26 09:18:04 发布

您现在位置:Python中文网/ 问答频道 /正文

在这篇文章的第一个问题之后,我仍在努力改进我的代码。在

为了更好地表达自己,我的目标是找到离给定日期最近的“时间段”。在

“时隙”代表我的“工厂”的开放时间(因此不包括周末和节假日)。在


     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,但没有得到很好的结果。在

因此,如果有任何有经验的建议可以给它很大的帮助!在

谢谢

附言:我尽力编辑了这篇旧帖子。希望不要让人困惑。。。在

我正在为我的工厂建立一个生产计划,我用Python和Pandas编写了它。

我有一个Pandas数据框,其中包含我的员工的工作时间(和工作日)。在

Working hours

另一方面,我有全天候工作的机器。在

我想要的是建立一个函数,在给定的日期内给我一个员工开始新工作的日期(以及他的一天结束的时间)。但有人可以等到第二天早上开始生产,或者等到第二天晚上才开始生产。在

例如:

^{pr2}$

我写得很慢,但它写得很慢) 在

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次),所以速度相当慢。在

我事先非常感谢你的帮助


Tags: 数据代码订单pandasdftime工厂时间
1条回答
网友
1楼 · 发布于 2024-04-26 09:18:04

最后使用对分法找到了一个有趣的解决方案:

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倍。。。在

相关问题 更多 >