2012-04-02 27 views
3

Excel/csvの従業員が病気にかかっている(多くの)従業員のリストを次の形式でリストしています。各病気の日のインスタンスは、それ自身の行を取得します。病気期間の長さを記録する別の列「Result」を追加したいと思います。たとえば、Mon-Tues-Wedは、これら3つのエントリのそれぞれに3というラベルが付いていることを意味します。連続した日付をまとめてグループ化する

私はPythonには初めてです。このアプローチが理想的かどうかは疑問ですが、

私の目標は、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日として週末に接する病気の期間を数えるonger。しかし、あなたがそうする正当な理由があるならば、誰が私を裁かなければなりません。 =)それらをカウントするには、実行を後処理します。最初の日が月曜日の場合は2を追加し、最後の日が金曜日の場合は2を追加し、次にlen(d for d in range(run[-1]-run[0]) if (run[0]+d*day).isWeekend())を追加します。もちろん、これは休日をカウントしません。その場合は、.isHoliday() or .isWeekend()を実行し、「追加2」ロジックをlen(...)ロジックと正確に同じようにします。休日が見つからなくなるまで繰り返して、週末にランに隣接している。

+1

'continueRun()'関数を呼び出すオーバーヘッドは本当に必要ありません。 'for'ループで' if run [-1] == x-1: 'を' for'ループで使用するだけです何かすてきなことをする。 – martineau

関連する問題