While Schleife/Daten weiter schreiben
Verfasst: Donnerstag 8. Oktober 2020, 15:49
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:
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.
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.