时间段搜索

时间:2017-04-18 14:38:10

标签: python pandas time lookup

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

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

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


     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,其中包含我员工的工作时间(以及工作日)。

Working hours

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

我正在寻找的是建立一个功能,在给定日期给出我的员工可以开始新工作的日期(以及他的一天结束时)。 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),所以它很慢。

我提前非常感谢你的帮助

1 个答案:

答案 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倍......