2017-07-05 8 views
0

従業員の開始時間と終了時間を持つpandasデータフレームがあります。従業員が特定のシフトで何時間働いているかを知りたい(シフト1:午前8時〜午後2時、シフト2:午後2時〜10時、シフト3:午後10時〜午後8時)。あなたの助けに感謝します。2つのデータから勤務時間を抽出する方法

  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

あなたの予想される出力は何ですか? – Zero

+1

'df.diff(axis = 1)' –

+0

あなたの予想される出力を見せている間に、[このリンクを確認](https://stackoverflow.com/questions/39370879/extract-hour-from-timestamp-with- python)を抽出します。あなたは分/秒をかけてプレイしたいですか? – MattR

答えて

0

私の答えはまだ磨かれていないことに注意してください。まず、問題のようにサンプルデータセットを作成します。

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) 

その後バック与えられた各シフト間隔

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 

を連結間の作業の時間を見つける

df_shift = pd.DataFrame([find_interval(r) for _, r in df.iterrows()]) 
df_out = pd.concat((df, df_shift), axis=1) # output 
関連する問題