İki tablonun verilerini üçüncü bir tabloya işlem yaparak ekleme

Yukarıdaki iki tablonun verilerini alıp, alttaki tabloyu oluşturmak gerekiyor. Ne tür bir algoritma kullanacağıma bir türlü karar veremedim. Hangi algoritmayı kurmaya kalksam tabloyu oluşturamadım.

Hayali bir buton olduğunu varsayın bu butona basıldığına yukarıdaki tabloyu verecek.
Yardımcı olabilirseniz gerçekten çok sevinirim.

Merhaba,

Bu iki tabloyu birleştirmek için nasıl bir kod yazdınız görebilir miyiz?

        matrix = []
        tablo3 = list(tablo3)
        matrix.append(tablo1[1][0]) #kayıt no
        matrix.append(tablo1[1][1]) #başlangıç tarih + saat

        tablo2_saat = tablo2[0][0] #tablo2'nin saatini aldım. Hernhagi bir tarih formatında olmadığından direkt string olarak alındı!!!!
        #tablo2_saat = datetime.strptime(tablo2[0][0],saat_format).time() #Eğer tarih formatında olsaydı burada yazılı olan kod ile dönüştürülecektir.
        #tablo2_saat_str = tablo2_saat.strftime(saat_format) # yukarıdaki kod tarih formatında olan saati string ifadeye getiriyor.

        gecici_tarih = "%d-%m-%Y" #tarih - saat olan format için sadece tarih kısmını almak için kullanacağım.
        tarihAl = datetime.strptime(tablo1[1][2], tarih_format).date() # tablodan sadece .date() yardımı ile tarih kısmını çektim.
        tarihAl = tarihAl.strftime(gecici_tarih) #tablodan çekilen tarihi, string ifadeye dönüştürdüm.
        tarihAl = tarihAl + " " + tablo2_saat #Farklı tablolardan string ifadeye dönüştürülen tarih ve saati tek string ile birleştirdim.
        matrix.append(tablo3[1][2]) #Tblo3 için bitiş sütunundaki tarih tablo1'den; saat tablo2'den olacak şekilde veriler çekilerek alındı ve eklendi. 


        #bundan sonrası tablo1deki başlangıç saati ile tablo2'deki başlangıç saatinin arasındaki sürenin hesaplanmasıdır.
        Baslangic_Saati = datetime.strptime(tablo1[1][1], tarih_format).time()
        Bitis_Saati = datetime.strptime(tablo2[0][0], saat_format).time()
        #sure_int = (datetime.combine(datetime.min, Bitis_Saati) - datetime.combine(datetime.min, Baslangic_Saati))
        sure_delta = datetime.combine(datetime.min, Bitis_Saati) - datetime.combine(datetime.min, Baslangic_Saati)
        sure_int = int(sure_delta.total_seconds() / 60)
        sure_str = (datetime.min + timedelta(minutes=sure_int)).time().strftime(tarih_format)
        sure_str = sure_str.split()
        sure_str = sure_str[1]
        matrix.append(sure_str) #Başlangıç ile bitiş süresi arasında geçen zamanın eklenmesi.

        matrix.append(tablo1[1][4]) #Tablo3'e eklenecek olan URETIM ifadesi.
        matrix.append(tablo1[1][5]) #Eğer üretim durursa bunun nedenini belirten kısım.
        tablo3.append(matrix) #Toplanan bütün verilerin matrix değişkeninde toplanmasıdır. Tablo3'ün matris olduğunu unutma!
        tablo3 = tuple(tablo3) #Verileri tuple şekline dönüştürdüm.
        print(tabulate(tablo3)) #Yapılan değişiklikleri görmek için gösterdim.

Bu şekilde tek tek yazarsam sorum yok ama benden istenen tek tek eklenmesi değil. Hepsini tek seferde eklemesini istiyor.

Kendi düşündüğüm bir algoritmada; döngüye almaya kalksam mola saatinden önce olan hangisi varsa onu ekliyor. Bunda sorun yok ama “Kayıt No” = 2 olduğunda toplamda üç tane kayıt var. Üretimin başlangıç ile mola başlangıç arası; mola başlangıç ve mola bitiş; Mola bitiş ile yemek molası arasındaki kısmı bir türlü algoritmaya oturtamadım.

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ı?

3 Beğeni

İstenen çıktı. Süre kısımlarına baktığımda hata gösteriyor. Benim yollamış olduğum fotoğrafta süre kısımları bitiş zamanında başlangıç zamanını çıkarmasıyla oluşuyor. Yani Kayıt No 2 ye bakacak olursan 08:30 da başlıyor ve 10:00 da bitiyor. Bu zamanları en başta attığım gri ve sarı tablodan alınıyor.

Süre kısımları haricinde geri kalan hata Kayıt No kısımları. Onları düzelterek programı bitirmeye çalışırım. Yardımın için çok teşekkür ederim.

Anladım, 1.5 ifadesi bir hata değil, 1.5 saat anlamına geliyor. Yani 1.5 sayısını saat:dakika formatına çevirirseniz 01:30 olarak görünür.

1 Beğeni

Tekrar merhaba, yukarıda alıntıladığım mesajdaki kodu kullanarak bazı durumlarda istenen çıktıyı alamayabilirsiniz.

Örneğin, df1 ve df2 normalde aşağıdaki gibi:

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", ""],
]


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ı"],
]

df2’yi şöyle değiştirelim:

df2 = [
    ["5/23/20 10:00", "5/23/20 10:15", "Çay molası"],
    ["5/23/20 12:00", "5/23/20 19:30", "Yemek molası"],
    ["5/23/20 13:00", "5/23/20 19:15", "Çay molası"],
]

Yukardaki kod, yeni df2 veri çerçevesini kullandığında şöyle bir çıktı üretir:

   0                   1                   2     3       4             5
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 19:30:00  7.50   Duruş  Yemek molası
5  5 2020-05-23 19:30:00 2020-05-23 13:00:00 -6.50  Üretim              
6  6 2020-05-23 13:00:00 2020-05-23 19:15:00  6.25   Duruş    Çay molası
7  7 2020-05-23 19:15:00 2020-05-23 13:45:00 -5.50   Duruş         Arıza
8  8 2020-05-23 13:45:00 2020-05-23 17:30:00  3.75  Üretim    

Yukardaki çıktıyı incelersek aslında çok da istediğimiz gibi çalışan bir kod yazmadığımızı görürüz. Evet, yazdığınız veri çerçevelerini kullanarak istenen çıktıyı belki elde edebiliyoruz ama yukardaki df2’deki yeni değerlere göre beklediğimiz çıktıyı üreten bir kod da yazabiliriz. Mesela yeni df2 için nasıl bir çıktı oluşmasını bekleriz? Eğer bir mola 12:00’de başlayıp, 19:30’da bitiyorsa, bu iki zaman arasında kalan başka hangi kategori varsa onların yok sayılması lazım.

Aşağıdaki kodu inceleyin lütfen:

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 t2_start != t1_start:
                df3 += [[len(df3), t1_start, t2_start, (t2_start - t1_start).total_seconds() / 3600, *r1[4:]]]
            if df3:
                if t2_end < df3[-1][2]:
                    break
            df3 += [[len(df3), t2_start, t2_end, (t2_end - t2_start).total_seconds() / 3600, "Duruş", r2[2]]]
            if t1_end > t2_end:
                df3 += [[len(df3), t2_end, t1_end, (t1_end - t2_end).total_seconds() / 3600, *r1[4:]]]
            break
    else:
        if df3:
            if df3[-1][2] > t1_end:
                break
        t1_start = t1_start if not df3 else df3[-1][2]
        df3 += [[len(df3), t1_start, t1_end, (t1_end - t1_start).total_seconds() / 3600, *r1[4:]]]

print(pd.DataFrame(df3))

Yukardaki kodu yeni df2’yi kullanarak çalıştırdığımızda aldığımız çıktı şu şekilde:
Çıktı:

   0                   1                   2     3       4             5
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 19:30:00  7.50   Duruş  Yemek molası

df2’yi eski haline getirip programı tekrar çalıştırdığımızda aldığımız çıktı, bir önceki mesajda aldığımız çıktının aynısı olur:

   0                   1                   2     3       4             5
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              

Bu arada veri çerçeveleriyle çalışıyorsanız, pandas kütüphanesini incelemek isteyebilirsiniz.

1 Beğeni

Yardımların için çok teşekkür ederim.