Hımm, anladığım kadarıyla, mola saatlerini eklerken, üretim saatlerinin de bu mola sürelerine göre yeniden hesaplanmasını istiyorsunuz.
İlk tabloyu temsilen şu datayı kullanıyorum:
df1 = [
[1, "5/23/20 07:30", "5/23/20 08:30", "", "Üretim", ""],
[2, "5/23/20 08:30", "5/23/20 12:00", "", "Üretim", ""],
[3, "5/23/20 12:00", "5/23/20 13:00", "", "Üretim", ""],
[4, "5/23/20 13:00", "5/23/20 13:45", "", "Duruş", "Arıza"],
[5, "5/23/20 13:45", "5/23/20 17:30", "", "Üretim", ""],
]
Bu veri çerçevesinde, başlangıç ve bitiş sürelerinin farkları henüz hesaplanmamış bir halde.
İkinci çerçeve şöyle:
df2 = [
["5/23/20 10:00", "5/23/20 10:15", "Çay molası"],
["5/23/20 12:00", "5/23/20 12:30", "Yemek molası"],
["5/23/20 15:00", "5/23/20 15:15", "Çay molası"],
]
df3
diye boş bir liste tanımlayalım ve df3’ü oluşturmaya başlayalım.
Not: datetime
kütüphanesinin programın içine aktarılmış olması gerekiyor.
df3 = []
for r1 in df1:
t1_start = dt.strptime(r1[1], "%m/%d/%y %H:%M")
t1_end = dt.strptime(r1[2], "%m/%d/%y %H:%M")
for r2 in df2:
t2_start = dt.strptime(r2[0], "%m/%d/%y %H:%M")
t2_end = dt.strptime(r2[1], "%m/%d/%y %H:%M")
if t1_start <= t2_start < t1_end:
if t1_start != t2_start:
df3 += [[len(df3), t1_start, t2_start, (t2_start - t1_start).total_seconds() / 3600, *r1[4:]]]
df3 += [[len(df3), t2_start, t2_end, (t2_end - t2_start).total_seconds() / 3600, "Duruş", r2[2]]]
df3 += [[len(df3), t2_end, t1_end, (t1_end - t2_end).total_seconds() / 3600, *r1[4:]]]
break
else:
df3 += [[len(df3), t1_start, t1_end, (t1_end - t1_start).total_seconds() / 3600, *r1[4:]]]
Çıktı:
[[0, datetime.datetime(2020, 5, 23, 7, 30), datetime.datetime(2020, 5, 23, 8, 30), 1.0, 'Üretim', ''], [1, datetime.datetime(2020, 5, 23, 8, 30), datetime.datetime(2020, 5, 23, 10, 0), 1.5, 'Üretim', ''], [2, datetime.datetime(2020, 5, 23, 10, 0), datetime.datetime(2020, 5, 23, 10, 15), 0.25, 'Duruş', 'Çay molası'], [3, datetime.datetime(2020, 5, 23, 10, 15), datetime.datetime(2020, 5, 23, 12, 0), 1.75, 'Üretim', ''], [4, datetime.datetime(2020, 5, 23, 12, 0), datetime.datetime(2020, 5, 23, 12, 30), 0.5, 'Duruş', 'Yemek molası'], [5, datetime.datetime(2020, 5, 23, 12, 30), datetime.datetime(2020, 5, 23, 13, 0), 0.5, 'Üretim', ''], [6, datetime.datetime(2020, 5, 23, 13, 0), datetime.datetime(2020, 5, 23, 13, 45), 0.75, 'Duruş', 'Arıza'], [7, datetime.datetime(2020, 5, 23, 13, 45), datetime.datetime(2020, 5, 23, 15, 0), 1.25, 'Üretim', ''], [8, datetime.datetime(2020, 5, 23, 15, 0), datetime.datetime(2020, 5, 23, 15, 15), 0.25, 'Duruş', 'Çay molası'], [9, datetime.datetime(2020, 5, 23, 15, 15), datetime.datetime(2020, 5, 23, 17, 30), 2.25, 'Üretim', '']]
Bu çıktıyı daha okunaklı hale getirelim: Bunun için pandas
kütüphanesini kullanıyorum:
import pandas as pd
print(pd.DataFrame(df3, columns=["No", "Start", "End", "Duration", "Status", "Remark"]))
Çıktı:
No Start End Duration Status Remark
0 0 2020-05-23 07:30:00 2020-05-23 08:30:00 1.00 Üretim
1 1 2020-05-23 08:30:00 2020-05-23 10:00:00 1.50 Üretim
2 2 2020-05-23 10:00:00 2020-05-23 10:15:00 0.25 Duruş Çay molası
3 3 2020-05-23 10:15:00 2020-05-23 12:00:00 1.75 Üretim
4 4 2020-05-23 12:00:00 2020-05-23 12:30:00 0.50 Duruş Yemek molası
5 5 2020-05-23 12:30:00 2020-05-23 13:00:00 0.50 Üretim
6 6 2020-05-23 13:00:00 2020-05-23 13:45:00 0.75 Duruş Arıza
7 7 2020-05-23 13:45:00 2020-05-23 15:00:00 1.25 Üretim
8 8 2020-05-23 15:00:00 2020-05-23 15:15:00 0.25 Duruş Çay molası
9 9 2020-05-23 15:15:00 2020-05-23 17:30:00 2.25 Üretim
İstediğiniz çıktı böyle bir çıktı mı?