2012-04-02 2 views
3

Ich habe eine Liste von (vielen) Mitarbeitern in Excel/CSV, die kranke Tage nehmen, im folgenden Format aufgeführt. Jede Krankheitstagesinstanz erhält ihre eigene Zeile. Ich möchte eine weitere Spalte 'Ergebnis' hinzufügen, die die Länge der Krankenperiode aufzeichnet. Zum Beispiel, Mon-Di-Mi bedeutet, dass jeder dieser drei Einträge mit einem 3.Gruppieren von aufeinander folgenden Daten zusammen

Ich bin neu in Python, und ich frage mich, ob dieser Ansatz ideal ist, aber ich kann nicht sehen, wie SQL wäre einfacher, außer, Tabellen für jeden einzelnen Angestellten zu schaffen (einfach) und dann Analyse auf diesem (harte)

Mein Ziel ist in der Lage zu sein, 1-tägig lange Zeiträume von 10+ Tagesperioden zu trennen. Bonuspunkte hierfür über das Wochenende verteilt.

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 

Antwort

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 

Demo:

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

dies auf Ihre Situation anwenden zu können, definieren die Funktion continuesRun wie so, in Pseudo-Code:

Bemerkung am Rande: Es etwas moralisch scheint/pragmatisch falsch, meiner persönlichen Meinung nach zu zählen, erstreckt sich die Krankengeschichte über die Wochenenden als potentiell 2 oder 4 Tage Onger. Aber wenn Sie einen guten Grund dazu haben, wen soll ich beurteilen? =) Um diese zu zählen, verarbeiten Sie Ihre Läufe: Fügen Sie 2 hinzu, wenn der erste Tag Montag war, und fügen Sie 2 hinzu, wenn der letzte Tag Freitag war, dann fügen Sie len(d for d in range(run[-1]-run[0]) if (run[0]+d*day).isWeekend()) hinzu. Natürlich zählt das nicht Feiertage, in diesem Fall würden Sie .isHoliday() or .isWeekend() machen und die "add 2" Logik genau wie die len(...) Logik machen, indem Sie zurück iterieren, bis Sie einen Nicht-Feiertag finden, und die Person für jeden Urlaub-oder-bestrafen- Wochenende also neben dem Lauf.

+1

Sie brauchen nicht wirklich den Overhead des Aufrufs der 'supportsRun()' -Funktion - verwenden Sie einfach 'if run [-1] == x-1:' in der for-Schleife, wenn Sie nicht gehen etwas Besonderes machen. – martineau