2 farklı DataFrame Table'ı birleştirip programın kendi kendine yeni satırlar oluşturmasını sağlamak

2 farklı dataframe table oluşturdum ve bunları tkinter GUI entegre ettim.

İlk tablo;

Entry Start Finish Total Time (Hour) Status Reason for Stoppage
1 23.05.2020 07:30 23.05.2020 08:30 01:00 MANUFACTURE
2 23.05.2020 08:30 23.05.2020 12:00 03:30 MANUFACTURE
3 23.05.2020 12:00 23.05.2020 13:00 01:00 STOPPAGE MALFUNCTION
4 23.05.2020 13:00 23.05.2020 13:45 00:45 MANUFACTURE
5 23.05.2020 13:45 23.05.2020 17:30 03:45 MANUFACTURE

İkinci tablo;

Start Finish Reason for Stoppage
10:00 10:15 Coffee Break
12:00 12:30 Lunch Break
15:00 15:15 Coffee Break

Yapmam gereken şey bu iki tabloyu birleştirip saatlerine göre sıralamak.Ama aynı zamanda 1. ve 2. grafikte olmayan yeni satırlar olutşurmak,ama bunu benim elimle girmemem,programın kendi olutşurması lazım.Örnek vermek gerekirse,8:30-10:00 arasında bi çalışma saati var sonrasında mola veriliyor.Ama bu aralık üstteki grafiklerde yazmıyor ve bunu kendisi oluşturması gerekiyor.

Son olarak birleşmiş grafik şöyle bi şey olacak;

Entry Start Finish Total Time (Hour) Status Reason for Stoppage
1 23.05.2020 07:30 23.05.2020 08:30 01:00 MANUFACTURE
2 23.05.2020 08:30 23.05.2020 10:00 01:30 MANUFACTURE
3 23.05.2020 10:00 23.05.2020 10:15 00:15 STOPPAGE Coffee Break
4 23.05.2020 10:15 23.05.2020 12:00 01:45 MANUFACTURE
5 23.05.2020 12:00 23.05.2020 12:30 00:30 STOPPAGE Lunch Break
6 23.05.2020 12:30 23.05.2020 13:00 00:30 MANUFACTURE
7 23.05.2020 13:00 23.05.2020 13:45 00:45 STOPPAGE MALFUNCTION
8 23.05.2020 13:45 23.05.2020 15:00 01:15 MANUFACTURE
9 23.05.2020 15:00 23.05.2020 15:15 00:15 STOPPAGE Coffee Break
10 23.05.2020 15:15 23.05.2020 17:30 02:15 MANUFACTURE

Umarım sorunumu açıkça belli edebilmişimdir.Teşekkür ederim şimdiden <3

from tkinter import *
import tkinter as tk
from tkinter import ttk
from pandastable import Table
import pandas as pd
import numpy as np
# import style

root = tk.Tk()

root.title("Çalışma Ve Mola Saatleri")
root.geometry("1800x1600")

work={"Entry":["1","2","3","4","5"],
"Start":["23.05.2020" " 07:30","23.05.2020 08:30",
"23.05.2020 12:00","23.05.2020" " 13:00","23.05.2020 13:45"],
"Finish":["23.05.2020 08:30","23.05.2020 12:00",
"23.05.2020 13:00","23.05.2020 13:45","23.05.2020 17:30"],
"Total Time (Hour)":["01:00","03:30","01:00","00:45","03:45"],
"Status":["MANUFACTURE","MANUFACTURE","STOPPAGE","MANUFACTURE","MANUFACTURE"],
"Reason For Stoppage":[" "," ","MALFUNCTION"," "," "]}

graph1=pd.DataFrame(work)

frame=tk.Frame(root)
frame.place(width=200)

frame.pack(anchor=W,padx=100,pady=50,ipadx=120,ipady=30)


pt=Table(frame,dataframe=graph1)

pt.show()


Break={"Start":["10:00","12:00","15:00"],
    "Finish":["10:15","12:30","15:15"],
    "Reason For Stoppage":["Coffee Break","Lunch Break","Coffee Break"]}


graph2=pd.DataFrame(Break)

frame2=tk.Frame(root)
frame2.place(width=100,height=50)
frame2.pack(anchor=NE,padx=150,ipadx=20,ipady=10)

pt2=Table(frame2,dataframe=graph2)

pt2.show()



graph3=pd.concat([graph1,graph2])
frame3=tk.Frame(root)
frame3.place()
frame3.pack(anchor=SW,padx=100,ipadx=120,ipady=500)

pt3=Table(frame3,dataframe=graph3)

pt3.show()




root.mainloop()
1 Beğeni

Merhaba,
Çalışmayı mevcut kısıtlı bilgimle belirli bir yere kadar getirdim.
Kodları incelersen az buçuk yol katettiğimi görebilirsin.

kademe kademe ilerlediğim için kodlar kalabalık ve karışık görünebilir.

Yaptığımı kabaca anlatayım;

tarih = df1.iloc[0,1][:11]
ile ilk dataframe’in ilk satırındaki tarih bilgisini aldım.

df2["Start"] = tarih + df2["Start"]
ve
df2["Finish"] = tarih + df2["Finish"]
ile tarih bilgisini, 2. dataframe’e ekledim.

df3 = pd.concat([df1, df2])
ile 2 dataframe’i df3 adıyla birleştirdim, yeni data frame oluşturdum. İstersen bu iki dataframe’i birleştirip df1’e eşitleyebilirsin.

df3.Start = df3.Start.apply(pd.to_datetime)
ve
df3.Finish = df3.Finish.apply(pd.to_datetime)
ile tarih bilgileri ile çalışabilmek için bilgileri tarih biçiminde formatladım/dönüştürdüm.

df3 = df3.sort_values(by = "Start")
ile, df3 dataframe’i “Start” sütununa göre sıraladım ve df3’e eşitledim.

eksik kalan kısım, yeni eklenen saat diliminin, mevcut çalışma saatinde ilgili alana yerleştirilmesi.

Bunun için de saat aralıklarını denetleyip, gerekli bölümlemeyi yapacak fonksiyonu yazmalısın.

Dene bakalım, bu fonksiyonu yazmak ne jkadar vaktini alacak.

import pandas as pd
df1 = pd.read_excel("veri2.ods", sheet_name="Sayfa1")
df1
Entry Start Finish Total Time (Hour) Status Reason for Stoppage
0 1 23.05.2020 07:30 23.05.2020 08:30 01:00 MANUFACTURE NaN
1 2 23.05.2020 08:30 23.05.2020 12:00 03:30 MANUFACTURE NaN
2 3 23.05.2020 12:00 23.05.2020 13:00 01:00 STOPPAGE MALFUNCTION
3 4 23.05.2020 13:00 23.05.2020 13:45 00:45 MANUFACTURE NaN
4 5 23.05.2020 13:45 23.05.2020 17:30 03:45 MANUFACTURE NaN
df2 = pd.read_excel("veri2.ods", sheet_name="Sayfa2")
df2
Start Finish Reason for Stoppage
0 10:00 10:15 Coffee Break
1 12:00 12:30 Lunch Break
2 15:00 15:15 Coffee Break
tarih = df1.iloc[0,1][:11]
tarih
'23.05.2020 '
df2["Start"] = tarih + df2["Start"]
df2
Start Finish Reason for Stoppage
0 23.05.2020 10:00 10:15 Coffee Break
1 23.05.2020 12:00 12:30 Lunch Break
2 23.05.2020 15:00 15:15 Coffee Break
df2["Finish"] = tarih + df2["Finish"]
df2
Start Finish Reason for Stoppage
0 23.05.2020 10:00 23.05.2020 10:15 Coffee Break
1 23.05.2020 12:00 23.05.2020 12:30 Lunch Break
2 23.05.2020 15:00 23.05.2020 15:15 Coffee Break
df3 = pd.concat([df1, df2])
df3
Entry Start Finish Total Time (Hour) Status Reason for Stoppage
0 1.0 23.05.2020 07:30 23.05.2020 08:30 01:00 MANUFACTURE NaN
1 2.0 23.05.2020 08:30 23.05.2020 12:00 03:30 MANUFACTURE NaN
2 3.0 23.05.2020 12:00 23.05.2020 13:00 01:00 STOPPAGE MALFUNCTION
3 4.0 23.05.2020 13:00 23.05.2020 13:45 00:45 MANUFACTURE NaN
4 5.0 23.05.2020 13:45 23.05.2020 17:30 03:45 MANUFACTURE NaN
0 NaN 23.05.2020 10:00 23.05.2020 10:15 NaN NaN Coffee Break
1 NaN 23.05.2020 12:00 23.05.2020 12:30 NaN NaN Lunch Break
2 NaN 23.05.2020 15:00 23.05.2020 15:15 NaN NaN Coffee Break
df3.Start = df3.Start.apply(pd.to_datetime)
df3.Finish = df3.Finish.apply(pd.to_datetime)
df3
Entry Start Finish Total Time (Hour) Status Reason for Stoppage
0 1.0 2020-05-23 07:30:00 2020-05-23 08:30:00 01:00 MANUFACTURE NaN
1 2.0 2020-05-23 08:30:00 2020-05-23 12:00:00 03:30 MANUFACTURE NaN
2 3.0 2020-05-23 12:00:00 2020-05-23 13:00:00 01:00 STOPPAGE MALFUNCTION
3 4.0 2020-05-23 13:00:00 2020-05-23 13:45:00 00:45 MANUFACTURE NaN
4 5.0 2020-05-23 13:45:00 2020-05-23 17:30:00 03:45 MANUFACTURE NaN
0 NaN 2020-05-23 10:00:00 2020-05-23 10:15:00 NaN NaN Coffee Break
1 NaN 2020-05-23 12:00:00 2020-05-23 12:30:00 NaN NaN Lunch Break
2 NaN 2020-05-23 15:00:00 2020-05-23 15:15:00 NaN NaN Coffee Break
df3 = df3.sort_values(by = "Start")
df3
Entry Start Finish Total Time (Hour) Status Reason for Stoppage
0 1.0 2020-05-23 07:30:00 2020-05-23 08:30:00 01:00 MANUFACTURE NaN
1 2.0 2020-05-23 08:30:00 2020-05-23 12:00:00 03:30 MANUFACTURE NaN
0 NaN 2020-05-23 10:00:00 2020-05-23 10:15:00 NaN NaN Coffee Break
2 3.0 2020-05-23 12:00:00 2020-05-23 13:00:00 01:00 STOPPAGE MALFUNCTION
1 NaN 2020-05-23 12:00:00 2020-05-23 12:30:00 NaN NaN Lunch Break
3 4.0 2020-05-23 13:00:00 2020-05-23 13:45:00 00:45 MANUFACTURE NaN
4 5.0 2020-05-23 13:45:00 2020-05-23 17:30:00 03:45 MANUFACTURE NaN
2 NaN 2020-05-23 15:00:00 2020-05-23 15:15:00 NaN NaN Coffee Break
1 Beğeni

benim asıl zorlandığım kısım bölümlemeyi yapıp yeni satırlar oluşturmaktı aslında :persevere: :persevere: :persevere: :persevere:

Pandas’la pek alakam yok (ilk defa kullaniyorum) ama soru o kadar guzel ki, kurcalayayim dedim.

Bir takim satirlari ikiye bolecegimiz icin standart indexleme ve vektor bazli islemler pek isimize yaramayacak yanliz, row-row gitmek lazim:

def split_at(split_time, df):
	split_rows = []
	for row in df.itertuples():
		crossing = (row.Start < split_time) & (row.Finish > split_time)
		if crossing:
			left_row = row._replace(Finish=split_time)
			right_row = row._replace(Start=split_time)
			split_rows.append(left_row)
			split_rows.append(right_row)
		else:
			split_rows.append(row)
	return pd.DataFrame(split_rows)

shift_start = pd.to_datetime('23.05.2020 08:30')
graph1 = split_at(shift_start, graph1)
shift_end = pd.to_datetime('23.05.2020 10:30')
graph1 = split_at(shift_end, graph1)

Her seyden once zaman string’lerini hakiki datetime siniflarina cevirmek lazim. Ondan sonra kesisim hesaplayip bolmeleri yapmak kolay. Geriye kalani (hatta date cevrimini de, sagolsun) @m.halil halletmis.

1 Beğeni

Ben de Pandas kütüphanesi konusunda yeni sayılırım ama konu hoşuma gittiği için öğrenmek için zaman harcıyorum.
Bu tür sorular, yeni şeyler öğrenmem için faydalı oluyor.

Bugünkü araştırmam sonucu bir miktar daha ilerledim.
Belki yakın zamanda, istediğini tam olarak yapabilecek kodu yazarız.

Şuana kadar yaptıklarımı aşağı ekleyeyim.

import pandas as pd
df1 = pd.read_excel("veri2.ods", sheet_name="Sayfa1")
df1

İlk Data Frame’im;

Entry Start Finish Total Time (Hour) Status Reason for Stoppage
0 1 23.05.2020 07:30 23.05.2020 08:30 01:00 MANUFACTURE NaN
1 2 23.05.2020 08:30 23.05.2020 12:00 03:30 MANUFACTURE NaN
2 3 23.05.2020 12:00 23.05.2020 13:00 01:00 STOPPAGE MALFUNCTION
3 4 23.05.2020 13:00 23.05.2020 13:45 00:45 MANUFACTURE NaN
4 5 23.05.2020 13:45 23.05.2020 17:30 03:45 MANUFACTURE NaN
df2 = pd.read_excel("veri2.ods", sheet_name="Sayfa2")
df2

İkinci Data Frame’im;

Start Finish Reason for Stoppage
0 10:00 10:15 Coffee Break
1 12:00 12:30 Lunch Break
2 15:00 15:15 Coffee Break

İlk Data Frame’in ilk indisinden tarih bilgisini alıyorum;

tarih = df1.iloc[0,1][:11]
tarih
'23.05.2020 '

İlk Data Frame’in Start ve Finish Sütunlarını DateTime formatına dönüştürüyorum;

df1.Start = df1.Start.apply(pd.to_datetime)
df1.Finish = df1.Finish.apply(pd.to_datetime)
df1
Entry Start Finish Total Time (Hour) Status Reason for Stoppage
0 1 2020-05-23 07:30:00 2020-05-23 08:30:00 01:00 MANUFACTURE NaN
1 2 2020-05-23 08:30:00 2020-05-23 12:00:00 03:30 MANUFACTURE NaN
2 3 2020-05-23 12:00:00 2020-05-23 13:00:00 01:00 STOPPAGE MALFUNCTION
3 4 2020-05-23 13:00:00 2020-05-23 13:45:00 00:45 MANUFACTURE NaN
4 5 2020-05-23 13:45:00 2020-05-23 17:30:00 03:45 MANUFACTURE NaN

Finish ve Start arasındaki zaman farkını hesaplatıp , Total Time (Hour) sütununa ekletiyorum.

df1["Total Time (Hour)"] = df1.Finish - df1.Start
df1
Entry Start Finish Total Time (Hour) Status Reason for Stoppage
0 1 2020-05-23 07:30:00 2020-05-23 08:30:00 0 days 01:00:00 MANUFACTURE NaN
1 2 2020-05-23 08:30:00 2020-05-23 12:00:00 0 days 03:30:00 MANUFACTURE NaN
2 3 2020-05-23 12:00:00 2020-05-23 13:00:00 0 days 01:00:00 STOPPAGE MALFUNCTION
3 4 2020-05-23 13:00:00 2020-05-23 13:45:00 0 days 00:45:00 MANUFACTURE NaN
4 5 2020-05-23 13:45:00 2020-05-23 17:30:00 0 days 03:45:00 MANUFACTURE NaN

İkinci DataFrame’de Start ve Finish Sütunlarındaki saat bilgisinin önüne tarih bilgisini ekliyorum

df2.Start = tarih + df2.Start
df2.Finish = tarih + df2.Finish
df2
Start Finish Reason for Stoppage
0 23.05.2020 10:00 23.05.2020 10:15 Coffee Break
1 23.05.2020 12:00 23.05.2020 12:30 Lunch Break
2 23.05.2020 15:00 23.05.2020 15:15 Coffee Break

İkinci DataFrame’de Start ve Finish Sütunlarını DateTime formatına dönüştürüyor, aralarındaki zaman farkını Total Time (Hour) sütununa ekletiyorum

df2.Start = df2.Start.apply(pd.to_datetime)
df2.Finish = df2.Finish.apply(pd.to_datetime)
df2["Total Time (Hour)"] = df2.Finish - df2.Start
df2
Start Finish Reason for Stoppage Total Time (Hour)
0 2020-05-23 10:00:00 2020-05-23 10:15:00 Coffee Break 0 days 00:15:00
1 2020-05-23 12:00:00 2020-05-23 12:30:00 Lunch Break 0 days 00:30:00
2 2020-05-23 15:00:00 2020-05-23 15:15:00 Coffee Break 0 days 00:15:00

İki DataFrame’i, Yeni bir data frame’de alt alta birleştiriyorum (yeni data frame oluşturmak zorunda değiliz aslında.)

df3 = pd.concat([df1,df2])
df3
Entry Start Finish Total Time (Hour) Status Reason for Stoppage
0 1.0 2020-05-23 07:30:00 2020-05-23 08:30:00 0 days 01:00:00 MANUFACTURE NaN
1 2.0 2020-05-23 08:30:00 2020-05-23 12:00:00 0 days 03:30:00 MANUFACTURE NaN
2 3.0 2020-05-23 12:00:00 2020-05-23 13:00:00 0 days 01:00:00 STOPPAGE MALFUNCTION
3 4.0 2020-05-23 13:00:00 2020-05-23 13:45:00 0 days 00:45:00 MANUFACTURE NaN
4 5.0 2020-05-23 13:45:00 2020-05-23 17:30:00 0 days 03:45:00 MANUFACTURE NaN
0 NaN 2020-05-23 10:00:00 2020-05-23 10:15:00 0 days 00:15:00 NaN Coffee Break
1 NaN 2020-05-23 12:00:00 2020-05-23 12:30:00 0 days 00:30:00 NaN Lunch Break
2 NaN 2020-05-23 15:00:00 2020-05-23 15:15:00 0 days 00:15:00 NaN Coffee Break

Üçüncü DataFrame’i, Start sütununa göre sıralıyoruz.

df3.sort_values(by="Start")
Entry Start Finish Total Time (Hour) Status Reason for Stoppage
0 1.0 2020-05-23 07:30:00 2020-05-23 08:30:00 0 days 01:00:00 MANUFACTURE NaN
1 2.0 2020-05-23 08:30:00 2020-05-23 12:00:00 0 days 03:30:00 MANUFACTURE NaN
0 NaN 2020-05-23 10:00:00 2020-05-23 10:15:00 0 days 00:15:00 NaN Coffee Break
2 3.0 2020-05-23 12:00:00 2020-05-23 13:00:00 0 days 01:00:00 STOPPAGE MALFUNCTION
1 NaN 2020-05-23 12:00:00 2020-05-23 12:30:00 0 days 00:30:00 NaN Lunch Break
3 4.0 2020-05-23 13:00:00 2020-05-23 13:45:00 0 days 00:45:00 MANUFACTURE NaN
4 5.0 2020-05-23 13:45:00 2020-05-23 17:30:00 0 days 03:45:00 MANUFACTURE NaN
2 NaN 2020-05-23 15:00:00 2020-05-23 15:15:00 0 days 00:15:00 NaN Coffee Break

Şu an, çözebildiğim kısım buraya kadar.
Muhtemelen bunları çok daha kolay yoldan, daha az kod yazarak ta yapabiliriz ancak, konuları anlamak adına, aşama aşama yol almak bana kolay geldi.

Sırada, Start ve Finish Sütunlarını kıyaslayarak, bölme, işlemleri var.
Bakalım onları doğru gerçekleştirebilecek miyim?

1 Beğeni