2012-04-02 58 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