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.