2012-04-02 99 views
3

我有一个Excel/csv中以(以下格式)列出的患病日的(许多)员工列表。每个病态的日子实例都有自己的路线。我想添加另一列“结果”,其中记录了病期的长度。例如,Mon-Tuesday-Wed意味着这三个条目中的每一个都被标记为3.我对于python是新的,我想知道这种方法是否理想,尽管我不知道SQL会如何更容易,除了为每个员工创建表格(简单)并对其执行分析(难)将连续日期分组在一起

我的目标是能够从10天以上分离1天的长期。这个周末的奖金积分。

Person Date  Result 

A  02/04/2012  5 

B  02/04/2012  2 

A  03/04/2012  5 

B  03/04/2012  2 

A  04/04/2012  5 

A  05/04/2012  5 

A  06/04/2012  5 

B  25/04/2012  1 

A  25/04/2012  2 

A  26/04/2012  2 

B  30/04/2012  1 

回答

4
def group(iterable): 
    myIter = iter(iterable) 

    run = [next(myIter)] 
    def continuesRun(x): 
     return run[-1]==x-1 

    for x in myIter: 
     if continuesRun(x): 
      run.append(x) 
     else: 
      yield run 
      run = [x] 
    yield run 

演示:

>>> list(group([1,10,11,12,20,21])) 
[[1], [10, 11, 12], [20, 21]] 

若要将此您的情况,定义函数continuesRun像这样,在伪代码:

旁注:稍微在道义上似乎/在我个人看来,实际上错误的是将周末周末的病假计为2或4天l onger。但是,如果你有充分的理由这样做,我是谁来判断。 =)为了计算这些数据,后处理您的运行:如果第一天是星期一,则添加2,如果最后一天是星期五,则添加2,然后添加len(d for d in range(run[-1]-run[0]) if (run[0]+d*day).isWeekend())。当然,这不会计算假期,在这种情况下,您将执行.isHoliday() or .isWeekend(),并使逻辑完全像“len(...)”逻辑一样,通过迭代,直到找到非假日为止,并惩罚每个节假日的人,周末因此与跑步相邻。

+1

你并不需要调用'continueRun()'函数的开销 - 如果你不打算在'for'循环中使用'if run [-1] == x-1:'''去做任何事情。 – martineau 2014-02-14 10:59:57