While Schleife/Daten weiter schreiben

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

Schönen guten Tag,

Ich habe ein relativ einfaches Problem nur stehe leider total auf dem Schlauch und bin mit meinem Wissen am Ende ( Ich glaube es ist ein offentlicher Denkfehler auf den Ich gerade nicht komme )


Mein Code:

Code: Alles auswählen

import openpyxl
import sys
import os.path
import time
import datetime
import pandas as pd
from decimal import *
from pathlib import Path
import datetime
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
pd.set_option('display.width', None)
pd.set_option('display.max_colwidth', -1)
pd.set_option('mode.chained_assignment', None)# Schaltet SettingWithCopyWarning aus
#-------------------------------------------Import Ende-----------------------------------------------------------------
Basis_Pfad = Path("C:/Users/Marcel/Desktop/Klimareport Test Ordner")

Statistikdatei_Pfad=Basis_Pfad/"Klimastatistik_Test.xlsx"
Statistik_Sheet_Name = "statistik"
Statistik_Excel_Reader = pd.read_excel(Statistikdatei_Pfad,sheet_name=Statistik_Sheet_Name,skiprows=1)
Statistik_Excel_Reader_original=pd.read_excel(Statistikdatei_Pfad,sheet_name=Statistik_Sheet_Name)


Klimawerte_Pfad = Basis_Pfad/"Aktuell.1.xlsx"
Klimawerte_Sheet_Name = "Statistik C"
Klimawerte_Excel_Reader =pd.read_excel(Klimawerte_Pfad,sheet_name=Klimawerte_Sheet_Name,header=None,skiprows=3,nrows=23) #names=["Monate","Werte"])#,usecols="A:B"
Klimawerte_Excel_Reader_original=pd.read_excel(Klimawerte_Pfad,sheet_name=Klimawerte_Sheet_Name)


TEST = Statistikdatei_Pfad
TEST_Excel_Writer =pd.ExcelWriter(TEST,engine="openpyxl",mode="a")






                        #2005,1
def Suchen_in_Datenbank(Jahr,Monat):#Man übergibt dieser Funktion zwei Integerwerte(Jahr ,Monat) danach wird zurückgegeben ob der Eintrag vorhanden ist - Erster Eintrag = 2005,5
    Daten_aus_Statistik = Statistik_Excel_Reader
    #print(Daten_aus_Statistik)
    Daten_vorhanden =(Daten_aus_Statistik["Jahr"].isin([Jahr]) & Daten_aus_Statistik["Monat"].isin([Monat]))
    if any(Daten_vorhanden) == True:#any gibt True zurück wenn ein Wert in der Series True ist
        return "vorhanden"
        #print(int(Daten_vorhanden[Daten_vorhanden[0:] == True].index.values))# damit kann man sehen in welcher Zeile
    else:
        return "nicht vorhanden"


                                           #"Nein","Ja"
def Letzter_Eintrag_aus_der_Statistikdatei(Ganze_Zeile,Jahr_Monat):#Man übergibt der Funktion"Ja" und "Nein" je nach dem welcher Wert ausgegben werden soll ->Zeile mit den ganzen Daten oder nur um welches Jahr und Monat es sich handelt
    Daten_Statistik = Statistik_Excel_Reader
    Gesamte_Eintraege = (Daten_Statistik.index.size)#-1 da wir ab 0 zählen
    #Daten_Statistik = Daten_Statistik.reset_index(drop=True)
    if Ganze_Zeile == "Ja" and Jahr_Monat == "Nein":
        #print(Daten_Statistik.loc[[Gesamte_Eintraege]])
        return Daten_Statistik.loc[[Gesamte_Eintraege]]
    if Ganze_Zeile == "Nein" and Jahr_Monat == "Ja":
        Rückgabewert =[Daten_Statistik["Jahr"].loc[Gesamte_Eintraege],Daten_Statistik["Monat"].loc[Gesamte_Eintraege]]
        #print(Rückgabewert)
        return Rückgabewert
    if Ganze_Zeile =="Ja" and Jahr_Monat =="Ja":#Gibt einen Dataframe sowie eine List zurück
        Rückgabewert = [Daten_Statistik["Jahr"].loc[Gesamte_Eintraege], Daten_Statistik["Monat"].loc[Gesamte_Eintraege]]
        return (Daten_Statistik.loc[[Gesamte_Eintraege]],Rückgabewert)
    if Ganze_Zeile =="Nein" and Jahr_Monat=="Nein":
        Letzter_Zeilen_Wert = (Daten_Statistik.index.size)
        #print(Letzter_Zeilen_Wert)
        Letzter_Zeilen_Wert = Letzter_Zeilen_Wert+2
        #print(Letzter_Zeilen_Wert)
        return Letzter_Zeilen_Wert





def Nächster_Eintrag_der_in_Statistikdatei_geschrieben_werden_muss():#Holt sich aus dem letzten Eintrag die Daten und addiert einen Monat dazu oder wenn Dezember vorhanden ist setzt er den Monat auf Januar und addiert 1 Jahr dazu
    Jahr_Monat=Letzter_Eintrag_aus_der_Statistikdatei("Nein","Ja")
    Jahr = Jahr_Monat[0]
    Monat = Jahr_Monat[1]
    if Monat == 12:
        Jahr_Monat = []
        Jahr=Jahr+1
        Monat=1
        Jahr_Monat.append(Jahr)
        Jahr_Monat.append(Monat)
        #print(Jahr_Monat)
        return Jahr_Monat
    else:
        Jahr_Monat = []
        Monat=Monat+1
        Jahr_Monat.append(Jahr)
        Jahr_Monat.append(Monat)
        #print(Jahr_Monat)
        return Jahr_Monat

                                  #"Ja",Nein,gibt optional an aus welcher Zeile gelesen wird standard Januar
def Daten_aus_der_Klimawertedatei(Kompletter_Datensatz,Einzelne_Zeile,Bestimmte_Zeile=1):#Hier werden die Daten aus der Klimawertedatei geladen und formatier ungültige Werte werden entfernt und der Index vernüftig gemacht
    Daten_Klimawerte = Klimawerte_Excel_Reader
    Daten_Klimawerte = Daten_Klimawerte.dropna(how="all")
    #Daten_Klimawerte = Daten_Klimawerte.fillna()
    Daten_Klimawerte.rename(columns={0:"Monat",1:"Daten"},inplace=True)
    Daten_Klimawerte.loc[:,"Monat"] = [1,2,3,4,5,6,7,8,9,10,11,12]#Monate werden hier überschrieben damit man mit den Integerwerten arbeiten kann
    #Daten_Klimawerte.set_index("Monat",inplace=True)#hier wird die Monatsspalte zu Indexspalte
    Daten_Klimawerte = Daten_Klimawerte.reset_index(drop=True)
    Daten_Klimawerte.index = (Daten_Klimawerte.index + 1)
    if Kompletter_Datensatz == "Nein" and Einzelne_Zeile == "Nein":
        Anzahl_der_Werte = Daten_Klimawerte["Daten"].count()
        return Anzahl_der_Werte
    if Kompletter_Datensatz == "Ja" and Einzelne_Zeile == "Nein":
        Daten_Klimawerte=Daten_Klimawerte.fillna("")
        #print(Daten_Klimawerte)
        return Daten_Klimawerte
    if Einzelne_Zeile =="Ja" and Kompletter_Datensatz == "Nein":
        Daten_Klimawerte=Daten_Klimawerte.fillna("")
        Daten_Klimawerte = Daten_Klimawerte.iloc[Bestimmte_Zeile -1]
        #print(Daten_Klimawerte)
        return Daten_Klimawerte






def Klimawerte_Jahr_und_Monat_ermitteln():#Gibt an bis zu welchem Monat Daten vorhanden sind in der Klimawertedatei->Das Jahr wird über die Datei extrahiert,und der Monat wird abgeleitet über die Zählung von Messdaten
    Jahr_Daten_Klimawerte = Klimawerte_Excel_Reader_original
    Jahr = list(Jahr_Daten_Klimawerte.columns)[0]
    Jahr = int(Jahr.strftime("%Y"))
    Monat= Daten_aus_der_Klimawertedatei("Nein","Nein")
    Jahr_Monat = []
    Jahr_Monat.append(Jahr)
    Jahr_Monat.append(Monat)
    #print(Jahr_Monat)
    return Jahr_Monat





def Ermittlung_welche_Daten_in_die_Statistik_geschrieben_werden_müssen(Fehlende,Vorhandene):
    Klimadaten = Klimawerte_Jahr_und_Monat_ermitteln()
    Klima_Jahr=int(Klimadaten[0])
    Klima_Monat=int(Klimadaten[1])
    Daten_die_eingefügt_werden_können = []
    Daten_die_eingefügt_wurden = []
    Zahler =0
    while Zahler != Klima_Monat+1:
        Zahler = Zahler+1
        if Zahler == Klima_Monat + 1:
            break
        Antwort=Suchen_in_Datenbank(Klima_Jahr,Zahler)
        if Antwort == "nicht vorhanden":
            Daten_die_eingefügt_werden_können.append(Klima_Jahr)
            Daten_die_eingefügt_werden_können.append(Zahler)
        if Antwort == "vorhanden":
            Daten_die_eingefügt_wurden.append(Klima_Jahr)
            Daten_die_eingefügt_wurden.append(Zahler)
    if Fehlende == "Ja" and Vorhandene == "Nein":
        #print(Daten_die_eingefügt_werden_können)
        return (Daten_die_eingefügt_werden_können)
    if Vorhandene =="Ja" and Fehlende == "Nein":
        #print(Daten_die_eingefügt_wurden)
        return (Daten_die_eingefügt_wurden)
    if Vorhandene =="Ja" and Fehlende =="Ja":
        #print(Daten_die_eingefügt_wurden)
        #print(Daten_die_eingefügt_werden_können)
        return Daten_die_eingefügt_wurden,Daten_die_eingefügt_werden_können






def Benötigte_Klimawerte_laden():
    Benötigte_Daten =Ermittlung_welche_Daten_in_die_Statistik_geschrieben_werden_müssen("Ja","Nein")
    if len(Benötigte_Daten) == 0:
        return Benötigte_Daten

    else:
        Benötigte_Zeile = Benötigte_Daten[1]
        Zeile_mit_Daten=Daten_aus_der_Klimawertedatei("Nein","Ja",Benötigte_Zeile)
        return Zeile_mit_Daten


def Formatierte_Klimawerte_laden():

    Daten_vorhanden =Benötigte_Klimawerte_laden()

    if len(Daten_vorhanden) == 0:
        return Daten_vorhanden

    else:
        Klimawerte_als_Liste = list(Benötigte_Klimawerte_laden())
        Klimawerte_Jahr = Klimawerte_Jahr_und_Monat_ermitteln()[0]
        Lücke = ""
        Strich = "-"
        #print(Klimawerte_Jahr)
        #print(Klimawerte_als_Liste[0])
        Formatierte_Klimawerte_Daten = []#-> Hier findet die händische formatierung statt
        Formatierte_Klimawerte_Daten.append(Klimawerte_Jahr)
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[0])
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[1])
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[2])
        Formatierte_Klimawerte_Daten.append(Lücke)
        Formatierte_Klimawerte_Daten.append(Lücke)
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[3])
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[4])
        Formatierte_Klimawerte_Daten.append(Lücke)
        Formatierte_Klimawerte_Daten.append(Lücke)
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[5])
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[6])
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[7])
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[8])
        Formatierte_Klimawerte_Daten.append(Lücke)
        Formatierte_Klimawerte_Daten.append(Lücke)
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[9])
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[10])
        Formatierte_Klimawerte_Daten.append(Lücke)
        Formatierte_Klimawerte_Daten.append(Lücke)
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[11])
        Formatierte_Klimawerte_Daten.append(Lücke)
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[12])
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[13])
        Formatierte_Klimawerte_Daten.append(Lücke)
        Formatierte_Klimawerte_Daten.append(Lücke)
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[14])
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[16])
        Formatierte_Klimawerte_Daten.append(Lücke)
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[17])
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[18])
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[19])
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[21])
        Formatierte_Klimawerte_Daten.append(Strich)
        Formatierte_Klimawerte_Daten.append(Strich)
        Formatierte_Klimawerte_Daten.append(Strich)
        Formatierte_Klimawerte_Daten.append(Strich)
        Formatierte_Klimawerte_Daten.append(Strich)
        Formatierte_Klimawerte_Daten.append(Strich)
        Formatierte_Klimawerte_Daten.append(Strich)
        Formatierte_Klimawerte_Daten.append(Strich)
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[22])
        Formatierte_Klimawerte_Daten.append(Strich)
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[23])
        Formatierte_Klimawerte_Daten.append(Strich)
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[24])
        Formatierte_Klimawerte_Daten.append(Strich)
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[25])
        Formatierte_Klimawerte_Daten.append(Strich)
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[26])
        Formatierte_Klimawerte_Daten.append(Strich)
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[27])
        Formatierte_Klimawerte_Daten.append(Strich)
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[28])
        Formatierte_Klimawerte_Daten.append(Strich)
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[29])
        Formatierte_Klimawerte_Daten.append(Strich)
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[30])
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[31])
        Formatierte_Klimawerte_Daten.append(Klimawerte_als_Liste[32])
        Formatierte_Klimawerte = pd.DataFrame(data=Formatierte_Klimawerte_Daten)
        return Formatierte_Klimawerte





def Formatierte_Klimawerte_in_die_Statistikdatei_schreiben():#Datei
    # 3 Zustände können entstehen 1 = alles hat geklappt ,2 = Fehler,3=Es sind keine neuen Daten oder überhaupt daten vorhanden



    Neue_letzte_Zeile =int(Letzter_Eintrag_aus_der_Statistikdatei("Nein","Nein"))#Ermittelt die neue Zeile in die rein geschrieben wird
    print(Neue_letzte_Zeile)
    Daten = Formatierte_Klimawerte_laden()

    if len(Daten)== 0:#-> Keine neuen Daten vorhanden
        return 1
    #else:
    try:
        with TEST_Excel_Writer as writer:
            writer.sheets = {sheet.title: sheet for sheet in writer.book}#sorgt dafür das kein neues Arbeitsblatt erschaffen wird
            Daten.T.to_excel(writer,sheet_name=Statistik_Sheet_Name,header=None, index=None,startrow=Neue_letzte_Zeile,startcol=0)
    except:
        print("Etwas ist schief glaufen eventuell war einer der Datein geöffnet")
        return 2
    finally:
        print(Statistik_Excel_Reader)
        #print("Datei wurde erfolgreich in Zeile",Neue_letzte_Zeile,"geschrieben")
        return 3








def Main():
    Formatierte_Klimawerte_in_die_Statistikdatei_schreiben()
    # Antwort = 3
    # while Antwort==3:
    #     Antwort = Formatierte_Klimawerte_in_die_Statistikdatei_schreiben()


if __name__ == "__main__":
    Main()
    sys.exit()


Mein Gedanke:

Ich ermittlere oben aus meinem Datensatz ( welche Daten fehlen und möchte diese in die Statistikdatei schreiben) wenn Ich meinen Code einmal ausführe funktioniert das auch wunderbar ( oder mehrfach einzelnd hintereinander auf run ) mein Gedanke ist weil das natürlich schwachsinn ist eine while schleife zu implementieren die das solange macht bis zum Beispiel weiter unten im Code ( Formatierte_Klimawerte_in_die_Statistikdatei_schreiben() -> len(Daten) == 0 wäre ,das Problem ist sobald Ich das versuche funktioniert mein Code leider nicht mehr -> er schreibt immer nur die gleiche Zeile in die Datei -> und dann geht die Datei kaputt ...:

Ich weiß nicht ob Ich ein denkfehler habe nur die Positionierung wo er reinschreiben soll holen Ich mir aus meiner Funktion Neue_letzte_Zeile =int(Letzter_Eintrag_aus_der_Statistikdatei("Nein","Nein")) und errechne mir diese über den Index meines Datenframes -> das Problem konnte Ich hier in soweit lokalisieren das das wenn er in die Funktion zum Beispiel ein zweites mal reinspringt er den Datenframe nicht aktualisiert ( er liest die Daten nicht neu ein die unten gerade in die Datei geschrieben wurden ) -> dadurch funktioniert meine Index Brechnung nicht etc ... jedoch verstehe Ich nicht wieso er die Datei nicht neu liest da Ich doch schreibe :


Daten_Statistik = Statistik_Excel_Reader und weiter oben habe Ich das als
Statistik_Excel_Reader = pd.read_excel(Statistikdatei_Pfad,sheet_name=Statistik_Sheet_Name,skiprows=1) deklariert.

Ich danke euch .


P.s Ich weiß das Ich mich nicht ganz an die Schreibweise gehalten habe ( Umlaute benutzt und keine Klassen erstellt ) Ich wollte der Leichtigkeit halber für mich das einmal grob runterprogrammieren und dann alles "vernünftig" machen.
Eine Vision ohne Aktion bleibe eine Illusion
Sirius3
User
Beiträge: 18220
Registriert: Sonntag 21. Oktober 2012, 17:20

An Konventionnen kann man sich auch beim ersten Runterprogrammieren halten. Funktionen und Variablennamen werden komplett klein geschrieben. Konstanten dagegen KOMPLETT_GROSS.
Benutze keine globalen Variablen.
`Statistik_Excel_Reader_original` wird nicht gebraucht. Außerdem ist auch `Statistik_Excel_Reader` kein Reader, sondern das sind die Daten in einem Dataframe. Ob das mal aus einer Excel-Datei kommt, oder nicht, ist völlig unerheblich.
Warum Du sowohl Klimawerte_Excel_Reader als auch Klimawerte_Excel_Reader_original hast, verstehe ich nicht. Die (fast) gleichen Daten sollten nicht in zwei Variablen stehen.
Warum nennst Du Statistikdatei_Pfad in TEST um? TEST ist doch ein total nichtssagender Name.

In `Suchen_in_Datenbank` kommt `Statistik_Excel_Reader` aus dem nichts. Warum nennst Du das dann in Daten_aus_Statistik um? Mit True muß man nicht explizit vergleiche. Und eine Funktion sollte keinen beschreibenden String zurückgeben, wenn es sich nur um einen Wahrheitswert handelt.
`isin` braucht man nur, wenn man mehrere Werte vergleichen will, aber exakt einen Wert in eine Liste zu packen und dann mit isin zu vergleichen, ist nur unendlich umständlich.
Bleibt also

Code: Alles auswählen

def suchen_in_datenbank(daten, jahr, monat):
    """ Man übergibt dieser Funktion zwei Integerwerte (Jahr, Monat)
    danach wird zurückgegeben ob der Eintrag vorhanden ist
    - Erster Eintrag = 2005,5
    """
    vorhanden = (daten["Jahr"] == jahr) & (daten["Monat"] == monat)
    return vorhanden.any()
In `Letzter_Eintrag_aus_der_Statistikdatei` wieder: wenn man einen Wahrheitswert hat, sollte man True oder False und nicht "Ja" / "Nein" übergeben. Statt viele if`s hintereinander, die sich gegenseitig ausschließen benutzt man elif und else.

Code: Alles auswählen

def liefere_letzten_eintrag(daten, ganze_zeile, jahr_monat):
    """ Man übergibt der Funktion True oder False je nach dem welcher
    Wert ausgegben werden soll
    -> Zeile mit den ganzen Daten oder nur um welches Jahr und Monat
    es sich handelt
    """
    letzer_eintrag = daten.iloc[[-1]]
    if jahr_monat:
        werte = list(letzer_eintrag.iloc[0][['A','B']])
        if ganze_zeile:
            return letzer_eintrag, werte
        else:
            return werte
    elif ganze_zeile:
        return letzer_eintrag
    else:
        return daten.index.size + 1
Die Funktion ist aber an sich schlecht, da sie viele unterschiedliche Typen an Rückgaben hat. Schreibe für jede Variante eine eigene Funktion.
In `Nächster_Eintrag_der_in_Statistikdatei_geschrieben_werden_muss` man Listen mit bekannter Anzahl an Einträgen direkt in den Eckigen Klammern. Umgekehrt benutzt man Unpacking um eine Liste aufzuspalten. Zeilen, die sowohl im if- als auch im else-Block vorkommen, sollte man einmal hinter den Block schreiben:

Code: Alles auswählen

def ermittle_naechstes_datum(daten):
    """ Holt sich aus dem letzten Eintrag die Daten und addiert einen Monat
    dazu oder wenn Dezember vorhanden ist setzt er den Monat auf Januar und
    addiert 1 Jahr dazu
    """
    jahr, monat = daten.iloc[-1]["Jahr", "Monat"]
    if monat == 12:
        monat = 1
        jahr += 1
    else:
        monat += 1
    return jahr, monat
Die weiteren Funktionen sollten auch aufgeräumt werden, aber ohne die konkreten Daten zu kennen, will ich da nichts umschreiben, könnte zu leicht fehlerhaft werden.

In `Formatierte_Klimawerte_in_die_Statistikdatei_schreiben` ist noch ein schwerer Fehler: benutze keine nakten exceps. Das wandelt nur eine sinnvolle Fehlermeldung in einen nichtssagenden Text um.

Zur eigentlichen Frage kann ich nichts sagen, da der Kontext fehlt. Kannst Du ein vereinfachtes Beispiel machen, welche Werte fehlen und warum die nicht richtig ersetzt werden.
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

Ich danke dir erstmal für deine schnelle und ausfühliche Antwort :)


Also meine Statistikdatei ist quasi so aufgebaut :
Jahr Monat ......
2019 9 26,3 22. 32,6 13.09.2016 2,2 20. -1,7 20.09.1969 0,4 19. 18,5......
2019 10 21,2 14. 27,1 13.10.2018 -3,3 31. -7,2 29.10.2017 -5,7 31. 16,8.....
2019 11 14,8 2. 19,2 04.11.2011 -2,8 11. -12,3 25.11.1993 -4,7 11. 12,6......
2019 12 15,0 17. 15,5 17.12.2015 -3,8 28 -16,6 02.12.1973 -6,1 29. 10,7.....
2020 1 12,8 15. 14,9 14.01.1993 -1,8 2. -23,1 08.01.1985 -3 20. 11.....
.
.
.

Meine Klimawartedatei sieht quasi so aus :
Januar 12,8 15. -1,8 2. -3,0 20. 11,0 9. -0,4 1. ..... A
Februar 17,4 16. -1,9 5. -4,4 5. 12,8 16. 2,4 27. ...... B
März 15,9 27. -3,9 30. -8,5 25. 11,0 18. 2,9 30 ......
April 24,4 8. -3,9 1. -7,0 1. 15,1 6 3,5 1.
Mai 26,5 21. -2,8 15. -6,6 15. 17,7 22. 6,7 12.
Juni 30,2 26. 7,5 6. 4,2 1. 23,5 26. 10,0 5.

SO wenn Ich meinen Code nun einmal ausführ wird quasi geguckt ( Ich nenne es mal um es zu verdeutlichen Zeile A) ist Zelle a im geladen Dataframe von meiner Statistikdatei vorhanden wenn ja wird es in eine Liste namens "vorhanden" geladen wenn zum Beispiel Zeile B nicht vorhanden ist wird das Datum (den darauf prüfe ich in dem Fall nur ( Jahr,Monat)) in eine Liste namen "nicht vorhanden" geladen dies geschieht für alle Datein die in meiner Klimawertedatei sind.

Weiter unten wird aufgrundlage des erste Element sich die Daten als Series aus dem Datenframe geholt und in Excel wird diese eine Zeile dann reingeschrieben.

Wenn Ich diesen Code wie schon beschrieben mehrfach als per Run einmal durchlaufen lassen sieht die Excel Datei dann quasi so aus :
(grobe Dastellung da Ich einen neuen Datenframe erstelle hier die Daten rein laden und andere Sachen formatiere )

Jahr Monat ......
2019 9 26,3 22. 32,6 13.09.2016 2,2 20. -1,7 20.09.1969 0,4 19. 18,5......
2019 10 21,2 14. 27,1 13.10.2018 -3,3 31. -7,2 29.10.2017 -5,7 31. 16,8.....
2019 11 14,8 2. 19,2 04.11.2011 -2,8 11. -12,3 25.11.1993 -4,7 11. 12,6......
2019 12 15,0 17. 15,5 17.12.2015 -3,8 28 -16,6 02.12.1973 -6,1 29. 10,7.....
2020 1 12,8 15. 14,9 14.01.1993 -1,8 2. -23,1 08.01.1985 -3 20. 11.....
2020 2 17,4 16. -1,9 5. -4,4 5. 12,8 16. 2,4 27. ...... 1.mal Code durchlaufen
2020 3 15,9 27. -3,9 30. -8,5 25. 11,0 18. 2,9 30 ...... 2.mal den Code durchlaufen



Mein Problem ist das Ich nur einmal den Code ausführen will und er einzelnd dabei die Zeilen nacheinander reinschreiben soll wenn Ich das jedoch mit einer while Schleife Versuche passiert folgendes :
Jahr Monat ......
2019 9 26,3 22. 32,6 13.09.2016 2,2 20. -1,7 20.09.1969 0,4 19. 18,5......
2019 10 21,2 14. 27,1 13.10.2018 -3,3 31. -7,2 29.10.2017 -5,7 31. 16,8.....
2019 11 14,8 2. 19,2 04.11.2011 -2,8 11. -12,3 25.11.1993 -4,7 11. 12,6......
2019 12 15,0 17. 15,5 17.12.2015 -3,8 28 -16,6 02.12.1973 -6,1 29. 10,7.....
2020 1 12,8 15. 14,9 14.01.1993 -1,8 2. -23,1 08.01.1985 -3 20. 11.....
2020 2 17,4 16. -1,9 5. -4,4 5. 12,8 16. 2,4 27. ...... <- hier bleibt es dann plötzlich die ganze Zeit stecken

Und schreibt diese Daten immer und und immer wieder auf die gleiche Position wodruch die Datei beschädigt wird .

Und ich versuche nun wie gesagt nicht weil Ich doch in meiner Funktion oben Letzter_Eintrag_aus_der_Statistikdatei().

Ihm doch sage Daten_aus_Statistik = Statistik_Excel_Reader ( dort müsste dann nach dem das erste mal der Code ausgeführt wurde ja eine Zeile ergänzt worden sein ) laden die ganzen Daten neu als Datenframe ( so wenn Ich dann im DebugerMode) mir jedoch den Datenframe angucke dann ist die neue Zeile jedoch nicht im Datenframe , wenn Ich jedoch in dem Moment in die Datei gucke ist die Zeile da ) und ich verstehe nicht wieder er die Daten nicht neu geladen hat .
Eine Vision ohne Aktion bleibe eine Illusion
Sirius3
User
Beiträge: 18220
Registriert: Sonntag 21. Oktober 2012, 17:20

So langsam blicke ich durch `Daten_aus_der_Klimawertedatei` durch. Statt die Daten bei jedem Aufruf aufzubereiten macht man das einmal, nach dem Laden:

Code: Alles auswählen

def lese_klimawerte(pfad, sheet_name):
    daten =pd.read_excel(pfad, sheet_name=sheet_name, header=None, skiprows=3, nrows=23)
    daten.dropna(how="all", inplace=True)
    daten.rename(columns={0:"Monat",1:"Daten"}, inplace=True)
    # Monate werden hier überschrieben damit man mit den Integerwerten arbeiten kann
    daten.index = [1,2,3,4,5,6,7,8,9,10,11,12]
    return daten
Der Rest der Funktion sollte wieder keine Funktion sein, sondern drei separate.
In `Klimawerte_Jahr_und_Monat_ermitteln` scheinst Du eine Zeile aus der Klimadatei zu benutzen, die Du oben verschwiegen hast. Ohne die Daten den Code zu dechiffrieren ist wirklich mühselig.
Die Datei scheint keinen Header zu haben, trotzdem liest Du die Datei, als ob es einen gäbe. So ist die erste Zelle (ein Datumsfeld) in die Columns gerutscht, was natürlich quatsch ist.
Wenn man das Jahr will, erst das Datum in einen String zu formatieren und dann wieder zu lesen ist reichlich umständlich.
Einfacher wäre es, alles auf einmal zu machen:

Code: Alles auswählen

def lese_klimawerte(pfad, sheet_name):
    daten = pd.read_excel(pfad, sheet_name=sheet_name, header=None)
    jahr = daten[0][0].year
    daten.set_index(0, inplace=True)
    return jahr, daten
Hier ist der Index die Monatsnamen, damit kann man viel bequemer auf einzelne Zeilen zugreifen.

In `Ermittlung_welche_Daten_in_die_Statistik_geschrieben_werden_müssen` sind die beiden Parameter übeflüssig, da Du eh beide Listen ermittelst, kannst Du sie auch beide zurückgeben und der Aufrufer nimmt halt die, die er braucht.
Eine while-Bedingung und noch zusätzlich ein if mit break. Da ist eins davon zu viel.
Zahler ist für eine Monatsnummer ein schlechter Name. Eine Liste, bei der immer 2 Einträge hintereinander zusammengehören ist nicht nutzbar. Zusammengehörende Daten gehören in eine Datenstruktur, z.B. ein Tuple.
Bleibt das übrig:

Code: Alles auswählen

MONATE = ["Januer", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November"]

def ermittle_daten(jahr, klimadaten, statistikdaten):
    vorhanden, fehlend = [], []
    for monat, name in enumerate(MONATE, 1):
        if suchen_in_datenbank(statistikdaten, jahr, monat):
            vorhanden.append((jahr, monat))
        elif name in klimadaten.index:
            fehlend.append((jahr, monat))
    return vorhanden, fehlend
Wobei das Jahr gar nicht in der Ausgabe gebraucht wird:

Code: Alles auswählen

MONATE = ["Januer", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November"]

def ermittle_daten(jahr, klimadaten, statistikdaten):
    vorhanden, fehlend = [], []
    for monat, name in enumerate(MONATE, 1):
        if suchen_in_datenbank(statistikdaten, jahr, monat):
            vorhanden.append(monat)
        elif name in klimadaten.index:
            fehlend.append(monat)
    return vorhanden, fehlend
Der Rest ist mir unverständlich, das habe ich mal aus der Beschreibung, was Du eigentlich machen willst, erschlossen:

Code: Alles auswählen

import pandas as pd
from pathlib import Path

BASIS_PFAD = Path("C:/Users/Marcel/Desktop/Klimareport Test Ordner")
STATISTIK_DATEI = BASIS_PFAD / "Klimastatistik_Test.xlsx"
STATISTIK_SHEET = "statistik"
KLIMAWERTE_DATEI = BASIS_PFAD / "Aktuell.1.xlsx"
KLIMAWERTE_SHEET = "Statistik C"

MONATE = ["Januer", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November"]

def suchen_in_datenbank(daten, jahr, monat):
    """ Man übergibt dieser Funktion zwei Integerwerte (Jahr, Monat)
    danach wird zurückgegeben ob der Eintrag vorhanden ist
    - Erster Eintrag = 2005,5
    """
    vorhanden = (daten["Jahr"] == jahr) & (daten["Monat"] == monat)
    return vorhanden.any()

def ermittle_fehlende_daten(jahr, klimadaten, statistikdaten):
    fehlende_monate = []
    for monat, name in enumerate(MONATE, 1):
        if suchen_in_datenbank(statistikdaten, jahr, monat):
            pass
        elif name in klimadaten.index:
            fefehlende_monatehlend.append((jahr, monat))
    return fehlende_monate

def lese_klimawerte(pfad, sheet_name):
    daten = pd.read_excel(pfad, sheet_name=sheet_name, header=None)
    jahr = daten[0][0].year
    daten.set_index(0, inplace=True)
    return jahr, daten

def lese_statistik(pfad, sheet_name)
    return pd.read_excel(pfad, sheet_name=sheet_name, skiprows=1)

def erzeuge_zeile(jahr, monat, daten):
    return [
        jahr, monat,
        daten[0], daten[1], '', '',
        daten[2], datem[3], '', '',
        daten[4], datem[5], daten[6], datem[7], '', '',
        daten[8], datem[9], '', '',
        daten[10], '',
        daten[11], datem[12], '', '',
        daten[13], datem[15], '',
        daten[16], datem[17], daten[18], datem[20],
        '-', '-', '-', '-', '-', '-', '-', '-',
        daten[21], '-',
        daten[22], '-',
        daten[23], '-',
        daten[24], '-',
        daten[25], '-',
        daten[26], '-',
        daten[27], '-',
        daten[28], '-',
        daten[29], daten[30], daten[31]
    ]

def main():
    jahr, klimadaten = lese_klimawerte(KLIMAWERTE_DATEI, KLIMAWERTE_SHEET)
    statistikdaten = lese_statistik(STATISTIK_DATEI, STATISTIK_SHEET)
    fehlende_monate = ermittle_fehlende_daten(jahr, klimadaten, statistikdaten)
    for monat in fehlende_monate:
        statistikdaten.append(erzeuge_zeile(jahr, monat, klimadaten.loc[MONATE[monat-1]]))
    statistikdaten.to_excel(STATISTIK_DATEI, STATISTIK_SHEET)

if __name__ == '__main__':
    main()
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

Ich danke dir erstmal das du dir so viel Mühe gemacht hast ,Ich habe mich jedoch dazu entschlossen meinen Code neu zu machen und mich an deinem zu orentieren mir ist es wichtig selbstständig was zu machen und nicht einfach etwas zu übernehmen dadurch lerne ich nämlich nichts.Ich danke dir trotzdem und falls Ich noch danach Probleme habe werde Ich mich melden :)
Eine Vision ohne Aktion bleibe eine Illusion
Antworten