Code: Alles auswählen
from pathlib import Path
import pandas as pd
import shutil
import time
#Einstellungen für Pandas:
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
# Pfade:
#HAUPTORDNER = Path(r"C:\Users\Marcel\Desktop\Dieter_Klimareport")
#ORDNER_MIT_DATEN = Path(HAUPTORDNER).joinpath("Dieter_Auswertung\Fertigdaten_2018_07.wrt")
#Pfad_Excel = Path(r"C:\Users\Marcel\Desktop\Dieter_Klimareport\Unterlagen_Manfred\Muster Klimazettel MAT.xlsx")
# Kanal-Nummern: # Excel-Nummer +1 da Datum später weggenommen wird
KEIN_KANAL = 0
LUFTTEMPERATUR = 3
RELATIVE_LUFTFEUCHTIGKEIT = 289
MAX_TEMPERATUR = 249
MIN_TEMPERATUR = 248
NIEDERSCHLAG = 261
SONNENSCHEINDAUER = 18
MAX_WIND = 139
WINDRICHTUNG = 73
#Intervalle
TAG = "D"
Uhrzeit_1 = "06:00:00"
Uhrzeit_2 = "6:50:00"
Uhrzeit_3 = "13:50:00"
Uhrzeit_4 = "20:50:00"
Uhrzeit_5 = "23:59:00"
#Umrechnungsfaktoren
STUNDE_IN_SEKUNDEN = 3600#(60*60)
#----------------------------------------Programm Anfang----------------------------------------------------------------
def daten_einlesen(daten):
"""Hier werden die Daten eingelesen und zurückgegeben"""
"Anmerkung low_memory ist standardmäig auf True dadurch läuft zwar das Programm schneller und benutzt weniger" \
"Arbeitsspeicher jedoch werden dadurch gemische Colums ( vom Typ her erzeugt da diese nicht so schenll zugeordnet" \
"werden können um das zu beheneben habe Ich es auf False gesetzt"
df = pd.DataFrame(pd.read_csv(daten,sep = "|",header = None,parse_dates = True,low_memory = False,na_values = "******",dtype = {"73":int} ))#low_Memory = False da pandas nicht alle typen bestimmen kann
df[0] = pd.to_datetime(df[0])
df = df.set_index(0) # df = zuordnen dann bleibt 1 spalte erhalten
anfang_index = df.index.tolist()[0] # ermittelt den ersten Index eintrag
ende_index = df.index.tolist()[-1] # ermittelt den letzten Index eintrag
return df,anfang_index,ende_index
def datum_fuer_excel(datum):
#gui_klimareport.win.progressbar(20)
MONATE = ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November",
"Dezember"]
datum = str(datum).split("-")
jahr = datum[0]
monat_zahl = int(datum[1])
monat_ausgeschrieben = MONATE[monat_zahl-1]
return jahr,monat_zahl,monat_ausgeschrieben
def kopie_der_vorlage_erzeugen(pfad,jahr,monat):
if monat <= 9:
monat="0"+str(monat)
monat = str(monat)
jahr = str(jahr)
if isinstance(pfad,str):
pfad=Path(pfad)
muster_original= pfad.joinpath("D:\Klimareport Dieter\Muster Klimazettel MAT.xlsx")
zusatz_kopie ="\\Klimareport Dieter\\"+"\\Excel\\"+"MAT"+"_"+"Klimareport"+"_"+jahr+"_"+monat+".xlsx"
kopie = pfad.joinpath(zusatz_kopie)
print(kopie)
if not kopie.exists():
shutil.copy(muster_original,kopie)
return kopie
def windgeschwindigkeit_mit_windrichtung(datensatz,kanalnummer_max_wind,kanalnummer_windrichtung,intervall):
"""Es wird ein neuer Datenframe erstellt mit der Windrichtung und dem Max Wind (nummer 73,139),in einem neuen Datenframe
werden die beiden Spalten in Abnhänihkeit der rechten Spalte (1 = 139) mit der freq D gropiert | der Index und die Spalte 0
werden Tageweise ausgewählt abhängig davon wo der Max Wert der Rechten Spalte war"""
df = datensatz[[kanalnummer_windrichtung,kanalnummer_max_wind]]
df_neu= df.loc[df.groupby(pd.Grouper(freq = intervall)).idxmax().iloc[:,1]]
return df_neu
def daten_mit_zeit_index(datensatz,kanalnummer,intervall):
"""Wir extrahieren die Spalte kanalnummer_lufttemperatur aus dem Datenframe datensatz danach suchen
wir im Index an Einträgen mit der Zeit intervalle in dem Fall übergeben wir diese zum Beispiel 06:50:00 und erhalten
in Integerwerte zurück in welcher Reihe sich die Zeit befindet wodruch wir gleichzeitig mit dem Integerwert auf den
Messwert zurgreifen können da es sich hier um 1 Dimensonale Werte handeln werden Series zurückgegeben"""
series= datensatz[kanalnummer]
index = series.index.indexer_at_time(time = intervall)
series_mit_neuem_index = pd.Series(series.iloc[index],dtype = float)
return series_mit_neuem_index
def series_zu_Datenframe(Werte1,Werte2,Werte3,Name1,Name2,Name3):
""""Die übergebenen Werte ( Series) werden von ihrem Index getrennt damit Sie einen einheitlichen erhalten( 1....)
danach werden Sie zusammengefasst zu einem Dataframe ,wird aktuell nicht benötigt da die Rechnung
des Mittelwertes in Excel stattfindet"""
Zeitraum1 = pd.Series(Werte1.reset_index(drop = True),name = Name1)
Zeitraum2 = pd.Series(Werte2.reset_index(drop = True),name = Name2)
Zeitraum3 = pd.Series(Werte3.reset_index(drop = True),name = Name3)
Zeitraum4 = pd.Series(Werte3.reset_index(drop = True),name = "lufttemp_20_50")
df = pd.concat([Zeitraum1,Zeitraum2,Zeitraum3,Zeitraum4],axis = 1)#axis 1 damit Sie nebeneinanderer gereiht werden ( 1 = Colum 0 = Index)
return df
def sonnenscheindauer_in_std(datensatz,kanalnummer,Umrechnungsfaktor):
"""Aus dem Datensatz wird die Spalte mit den Sonnenwerten extrahiert diese sind jedoch in Sekunden daher wird die
Tagessumme ermittelt und diese durch den Umrechnungswert dividiert um die Tagessumme in Stunden zu erhalten danch
werden die Werte auf 2 Nachkommastellen gerunden damit diese nicht zu lang werden"""
series = datensatz[kanalnummer]
series_summe_pro_tag = series.groupby(pd.Grouper(freq = "D")).sum()
sonnenstunden = series_summe_pro_tag.div(Umrechnungsfaktor)
return sonnenstunden
def daten_zusammenfassen(windrichtung_abhaengigkeit_windgeschwindigkeit,lufttemp_06_50,lufttemp_13_50,lufttemp_20_50,tml,relativ_luftfeucht_06_50,relativ_luftfeucht_13_50,relativ_luftfeucht_20_50,tmf,max_temp,min_temp,sonnenschein,niederschlag):
"""HINWEIS AKTUELL WERDEN tml und tmf NICHT benutzt da diese in Excel zusammen gefasst werden
Die Daten werden in mehreren Datenframes zusammengefasst damit diese nachher einzeln in die Excel Datei
geschrieben werden können ( es befinden sich dort Spalten mit Formeln -> ein großer Datenframe würde da nur stören"""
wert1 = windrichtung_abhaengigkeit_windgeschwindigkeit.reset_index(drop = True)
wert2 = lufttemp_06_50.reset_index(drop = True)
wert3 = lufttemp_13_50.reset_index(drop = True)
wert4 = lufttemp_20_50.reset_index(drop = True)
#wert5 = tml.reset_index(drop = True)
wert6 = relativ_luftfeucht_06_50.reset_index(drop = True)
wert7 = relativ_luftfeucht_13_50.reset_index(drop = True)
wert8 = relativ_luftfeucht_20_50.reset_index(drop = True)
#wert9 = tmf.reset_index(drop = True)
wert10 = max_temp.reset_index(drop = True)
wert11 = min_temp.reset_index(drop = True)
wert12 = sonnenschein.reset_index(drop = True)
wert13 = niederschlag.reset_index(drop = True)
df1 = pd.concat([wert1,wert2,wert3,wert4],axis = 1)
df2 = pd.concat([wert6,wert7,wert8],axis = 1)
df3 = pd.concat([wert10,wert11,wert12,wert13],axis = 1)
return df1,df2,df3
def daten_in_excel_schreiben(datenframe1,datenframe2,datenframe3,pfad,jahr,monat):
df1 = datenframe1.iloc[:10]
df1_1 = datenframe1.iloc[10:20]
df1_2 = datenframe1.iloc[20:]
df2 = datenframe2.iloc[:10]
df2_1 = datenframe2.iloc[10:20]
df2_2 = datenframe2.iloc[20:]
df3 = datenframe3.iloc[:10]
df3_1 = datenframe3.iloc[10:20]
df3_2 = datenframe3.iloc[20:]
datum = pd.Series([jahr])
monat = pd.Series([monat])
with pd.ExcelWriter(pfad, engine="openpyxl", mode="a") as writer:
writer.sheets = {sheet.title: sheet for sheet in writer.book} # sorgt dafür das kein neues Arbeitsblatt erschaffen wird
datum.to_excel(writer, sheet_name = "Klimareport_MAT", header = None, index = None, startrow = 1,startcol = 13)
monat.to_excel(writer, sheet_name = "Klimareport_MAT", header = None, index = None, startrow = 1,startcol = 11)
df1.to_excel(writer, sheet_name = "Klimareport_MAT", header = None, index = None,startrow = 8, startcol = 1)
df1_1.to_excel(writer, sheet_name = "Klimareport_MAT", header = None, index = None, startrow = 19, startcol = 1)
df1_2.to_excel(writer, sheet_name = "Klimareport_MAT", header = None, index = None, startrow = 30, startcol = 1)
df2.to_excel(writer, sheet_name = "Klimareport_MAT", header = None, index = None, startrow = 8, startcol = 7)
df2_1.to_excel(writer, sheet_name = "Klimareport_MAT", header = None, index = None, startrow = 19, startcol = 7)
df2_2.to_excel(writer, sheet_name = "Klimareport_MAT", header = None, index = None, startrow = 30, startcol = 7)
df3.to_excel(writer, sheet_name = "Klimareport_MAT", header = None, index = None, startrow = 8, startcol = 11)
df3_1.to_excel(writer, sheet_name = "Klimareport_MAT", header = None, index = None, startrow = 19, startcol = 11)
df3_2.to_excel(writer, sheet_name = "Klimareport_MAT", header = None, index = None, startrow = 30, startcol = 11)
def main(HAUPTORDNER,ORDNER_MIT_DATEN):
ausgelsene_daten,anfangs_index,ende_index = daten_einlesen(ORDNER_MIT_DATEN)#Dataframe
excel_datum_jahr,excel_datum_monatszahl,excel_datum_monat_ausgeschrieben= datum_fuer_excel(anfangs_index)
Pfad_Excel = kopie_der_vorlage_erzeugen(HAUPTORDNER,excel_datum_jahr,excel_datum_monatszahl)
windrichtung_abhaengigkeit_windgeschwindigkeit = windgeschwindigkeit_mit_windrichtung(ausgelsene_daten,MAX_WIND,WINDRICHTUNG,TAG)#Dataframe,=> nachher in Excel
lufttemp_06_50 = daten_mit_zeit_index(ausgelsene_daten, LUFTTEMPERATUR, Uhrzeit_2)#Series
lufttemp_13_50 = daten_mit_zeit_index(ausgelsene_daten,LUFTTEMPERATUR,Uhrzeit_3)#Series
lufttemp_20_50 = daten_mit_zeit_index(ausgelsene_daten,LUFTTEMPERATUR,Uhrzeit_4)#Series
tml = series_zu_Datenframe(lufttemp_06_50,lufttemp_13_50,lufttemp_20_50,"lufttemp_06_50","lufttemp_13_50", "lufttemp_20_50")#Dataframe => nachher in Excel
relativ_luftfeucht_06_50 = daten_mit_zeit_index(ausgelsene_daten, RELATIVE_LUFTFEUCHTIGKEIT, Uhrzeit_2)
relativ_luftfeucht_13_50 = daten_mit_zeit_index(ausgelsene_daten,RELATIVE_LUFTFEUCHTIGKEIT,Uhrzeit_3)
relativ_luftfeucht_20_50 = daten_mit_zeit_index(ausgelsene_daten,RELATIVE_LUFTFEUCHTIGKEIT,Uhrzeit_4)
tmf = series_zu_Datenframe(relativ_luftfeucht_06_50,relativ_luftfeucht_13_50,relativ_luftfeucht_20_50," relativ_luftfeucht_06_50"," relativ_luftfeucht_13_50","relativ_luftfeucht_20_50")#Dataframe => nachher in Excel
max_temp = daten_mit_zeit_index(ausgelsene_daten,MAX_TEMPERATUR,Uhrzeit_1)#Series ->nachher in Excel
min_temp = daten_mit_zeit_index(ausgelsene_daten,MIN_TEMPERATUR,Uhrzeit_1)#Series ->nachher in Excel
sonnenschein = sonnenscheindauer_in_std(ausgelsene_daten,SONNENSCHEINDAUER,STUNDE_IN_SEKUNDEN)#Series ->nachher in Excel
niederschlag = daten_mit_zeit_index(ausgelsene_daten,NIEDERSCHLAG,Uhrzeit_5)#Series ->nachher in Excel
datenframe1,datenframe2,datenframe3=daten_zusammenfassen(windrichtung_abhaengigkeit_windgeschwindigkeit,lufttemp_06_50,lufttemp_13_50,lufttemp_20_50,tml,relativ_luftfeucht_06_50,relativ_luftfeucht_13_50,relativ_luftfeucht_20_50,tmf,max_temp,min_temp,sonnenschein,niederschlag)
daten_in_excel_schreiben(datenframe1,datenframe2,datenframe3,Pfad_Excel,excel_datum_jahr,excel_datum_monat_ausgeschrieben)
return Pfad_Excel
if __name__=="__main__":
main()
Leider habe Ich noch nie mit Threads gearbeitet.
Und Ich stehe da auch auf dem schlauch ... Ich habe versucht die ( da die Arbeitsdatei 8-11 sekunden braucht ) danach die progressbar laufen zu lassen nur als Anwender hat man da dann natürlich das gefühl das nicht passiert ...
hmmm verstehe Ich leider nicht ganz -> da Ich sag mal die "Arbeitsdatei" fast "80 %" sind würde dann die Progressbar keinen Sinn machen wenn danach der Forschritt aktualisiert wird .... aber Ich habe mir das fast gedacht das das so nicht funktioniert...
Also Beispiel wenn ich eine globale Variable erzeuge in der gui und diese in der Arbeitsdatei verwenden will
bekomme Ich bei der Ausfrührung der gui den Fehler ->ImportError: cannot import name 'main' from 'Klimareport_Mat' (G:\Dieter_Klimareport\Klimareport\Klimareport_Mat.py)
Dieser Test wäre genau das gleich als wenn Ich so Versuchen würde die Classen Methode aufzurufen die dann nur set.value und den neuen Wert ändern würde