2017-07-05 17 views
0

Ich habe einen Pandas-Datenrahmen mit Mitarbeiter Startzeit und Endzeit. Ich möchte wissen, wie viele Stunden ein Mitarbeiter in einer bestimmten Schicht gearbeitet hat (Schicht 1: 8:00 - 14:00 Uhr; Schicht 2: 14:00 - 22:00 Uhr und Schicht 3: 10:00 - 8:00 Uhr). Deine Hilfe wird geschätzt.So extrahieren Sie Arbeitsstunden aus zwei Datenzeiten

  Start  End 
0 2015-01-01 18:44:00 2015-01-02 07:31:00 
1 2015-01-01 06:38:00 2015-01-01 19:57:00 
2 2015-01-01 06:34:00 2015-01-01 19:13:00 
3 2015-01-01 18:48:00 2015-01-02 07:15:00 
4 2015-01-01 06:50:00 2015-01-01 20:02:00 
+0

Was ist Ihre erwartete Ausgabe? – Zero

+1

'df.diff (Achse = 1)' –

+0

in der Zwischenzeit von uns zeigen Ihre erwartete Ausgabe, Überprüfen Sie [diesen Link] (https://stackoverflow.com/questions/39370879/extract-hour-from-timestamp-with- Python) um die Stunden zu extrahieren. Möchtest du Minuten/Sekunden ins Spiel bringen? – MattR

Antwort

0

Beachten Sie, dass meine Antwort noch nicht ganz polnisch ist. Zuerst erstelle ich einen Beispieldatensatz wie in Frage.

import pandas as pd 

df = pd.DataFrame([ 
    ['2015-01-01 18:44:00', '2015-01-02 07:31:00'], 
    ['2015-01-01 06:38:00', '2015-01-01 19:57:00'], 
    ['2015-01-01 06:34:00', '2015-01-01 19:13:00'], 
    ['2015-01-01 18:48:00', '2015-01-02 07:15:00'], 
    ['2015-01-01 06:50:00', '2015-01-01 20:02:00'] 
], columns=['start', 'stop']) 

df.start = pd.to_datetime(df.start) 
df.stop = pd.to_datetime(df.stop) 

Dann Zeit der Arbeit finden zwischen jedem Intervall verschieben gegeben

from datetime import datetime, timedelta 


def find_interval(r): 
    """ 
    r: row of dataframe, with 'start' and 'stop' column 
    """ 
    t_start = r['start'] 
    t_stop = r['stop'] 
    t = t_start 
    s1_start = datetime(t.date().year, t.date().month, t.date().day, 8) 
    s1_stop = datetime(t.date().year, t.date().month, t.date().day, 14) 
    s2_start = datetime(t.date().year, t.date().month, t.date().day, 14) 
    s2_stop = datetime(t.date().year, t.date().month, t.date().day, 22) 
    s3_start = datetime(t.date().year, t.date().month, t.date().day, 22) 
    s3_stop = datetime(t.date().year, t.date().month, t.date().day + 1, 8) 

    shift_hours = [] 
    for (s_start, s_stop) in [(s1_start, s1_stop), (s2_start, s2_stop), (s3_start, s3_stop)]: 
     if t_stop < s_start: 
      shift_hours.append(timedelta(seconds=0)) 
     elif t_stop > s_start and t_stop < s_stop: 
      shift_hours.append(t_stop - s_start) 
     elif t_start < s_stop and t_stop > s_stop: 
      shift_hours.append(s_stop - t_start) 
     else: 
      shift_hours.append(timedelta(seconds=0)) 
    return shift_hours 

Concatenate zurück

df_shift = pd.DataFrame([find_interval(r) for _, r in df.iterrows()]) 
df_out = pd.concat((df, df_shift), axis=1) # output 
Verwandte Themen