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
Was ist Ihre erwartete Ausgabe? – Zero
'df.diff (Achse = 1)' –
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