Ich danke dir erstmal für die schnelle Antwort mich wundert es ehrlich gesagt auch.... da Ich im Internet überall gelesen habe das beides funktionieren sollte.
Also die Ordnerstruktur ist wie folgt: C:\Users\Marcel\PycharmProjects\NEU_Klimareport_Dieter-fertig -> in NEU_Klimareport_Dieter-fertig liegen alle Datein.
Code: Alles auswählen
from pathlib import Path
import numpy as np
import pandas as pd
import shutil
import timeit
# 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
fertigdaten = Path(r"C:\Users\Marcel\Desktop\Fertigdaten\Fertigdaten_2020_04.wrt")
speicherpfad = Path(r"C:\Users\Marcel\Desktop\Dummy Datein\Ausgewerte_Daten")
KANALNUMMER = {
"DATUM": 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": "06:50:00",
"Uhrzeit_3": "13:50:00",
"Uhrzeit_4": "20:50:00",
"Uhrzeit_5": "23:59:00",
}
MONATE = {
1: "Januar",
2: "Februar",
3: "März",
4: "April",
5: "Mai",
6: "Juni",
7: "Juli",
8: "August",
9: "September",
10: "Oktober",
11: "November",
12: "Dezember"
}
UMRECHNUNGSFAKTOR = 3600
def daten_einlesen(pfad_fertigdaten):
"""
-Die Daten werden eingelesen
-Das Datum der Datei wird als Index festgelegt
"""
datensatz = pd.read_csv(
pfad_fertigdaten,
sep="|",
header=None,
parse_dates=True,
low_memory=False,
na_values="******",
usecols=[*KANALNUMMER.values()] # Holt sich die Spaltenzahlen aus dem Dictonary
)
datensatz[0] = pd.to_datetime(datensatz[0])
datensatz = datensatz.set_index(0) # Datum wird Index
datensatz = datensatz.fillna(int(-1))
return datensatz
def datum_fuer_excel(ausgelesene_daten):
"""
Aus dem Index der ausgelesenene_daten wird das jahr sowie der Monat extrahiert
"""
anfangs_index = ausgelesene_daten.index.tolist()[0]
jahr = str(anfangs_index).split("-")[0]
monat = int(str(anfangs_index).split("-")[1]) # damit aus 04->4 wird
monat_als_wort = MONATE.get(monat)
return jahr, monat_als_wort, monat
def winddaten_erhalten(ausgelesene_daten):
"""
-Aus dem übergebenen Datensatz werden die KANÄLE WINDRICHTUNG & MAX_WIND extrahiert
-Danach werden wird für jedenTag der höchste MAX_Wind ermittelt und in abhängigkeit die dazugehörige WINDRICHTUNG
-Am Ende werden die Values mit -1 zu einem leeren string gewandelt
"""
winddaten = ausgelesene_daten[[KANALNUMMER.get("WINDRICHTUNG"), KANALNUMMER.get("MAX_WIND")]]
winddaten = winddaten.loc[winddaten.groupby(pd.Grouper(freq="D")).idxmax().iloc[:, 1]]
winddaten = winddaten.replace(-1, "******")
return winddaten
def daten_mit_anderen_zeitindex(ausgelesene_daten, kanalnummer, intervall):
"""
Wir extrahieren die übergebene kanalnummer aus dem übergebenen Datensatz,danach erstellen wir einen neuen Index
in abhängigkeit von dem Übergebenen intervall und legen diesen über die extrahierten_daten.
Beispiel:
Wir übergebenen Uhrzeit_2 = "06:50:00" dann sieht unsere Series am Ende wie folgt aus
2020-04-01 06:50:00 1.56
2020-04-02 06:50:00 5.02
2020-04-03 06:50:00 5.95
...
"""
extrahierte_daten = ausgelesene_daten[kanalnummer]
extrahierte_daten = pd.to_numeric(extrahierte_daten, errors='coerce').astype(
"float") # leer strings führen zu fehlern
neuer_index = extrahierte_daten.index.indexer_at_time(time=intervall)
extrahierte_daten_mit_neuem_index = pd.Series(extrahierte_daten.iloc[neuer_index], dtype=float)
extrahierte_daten_mit_neuem_index = extrahierte_daten_mit_neuem_index.replace(-1, "******")
return extrahierte_daten_mit_neuem_index
def sonnenschein_erhalten(ausgelesene_daten):
"""Aus dem Datensatz wird die Spalte mit der SONNENSCHEINDAUER extrahiert diese sind jedoch in Sekunden daher wird
die Tagessumme ermittelt und diese durch den Umrechnungswert dividiert um die Tagessumme in Stunden zu erhalten
"""
sonnenschein = ausgelesene_daten[KANALNUMMER.get("SONNENSCHEINDAUER")]
sonnenschein = sonnenschein.replace(to_replace=-1, value=np.nan)
sonnenschein = sonnenschein.groupby(pd.Grouper(freq=INTERVALLE.get("TAG"))).sum(
min_count=1) # mindestens 1 nicht nan value
sonnenschein = sonnenschein.div(UMRECHNUNGSFAKTOR)
sonnenschein = sonnenschein.replace(np.nan, "******") # wenn ergebnis 0 wäre -> ungültig
return sonnenschein
def daten_zusammenfassen(winddaten, luft_temp0650, luft_temp1350, luft_temp2050, relativ_luftfeucht0650,
relativ_luftfeucht1350, relativ_luftfeucht2050, max_temp, min_temp, sonnenschein,
niederschlag):
"""
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 = winddaten.reset_index(drop=True)
wert2 = luft_temp0650.reset_index(drop=True)
wert3 = luft_temp1350.reset_index(drop=True)
wert4 = luft_temp2050.reset_index(drop=True)
wert6 = relativ_luftfeucht0650.reset_index(drop=True)
wert7 = relativ_luftfeucht1350.reset_index(drop=True)
wert8 = relativ_luftfeucht2050.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)
zusammengefasste_daten1 = pd.concat([wert1, wert2, wert3, wert4], axis=1)
zusammengefasste_daten2 = pd.concat([wert6, wert7, wert8], axis=1)
zusammengefasste_daten3 = pd.concat([wert10, wert11, wert12, wert13], axis=1)
return zusammengefasste_daten1, zusammengefasste_daten2, zusammengefasste_daten3
def ordner_datei_organisation(speicherpfad_pfad, jahr, monat):
"""
Es wird geprüft ob der speicherpfad existiert wenn nicht wird ein Ordner anglegt,das gleiche wird mit einem
Excel Ordner gemacht in dem die neuen Excel Datein gespeichert werden danach wird eine Kopie der Muster-Datei
erstellt in,danach wird die neu erstellt Datei mit dem Jahr und Monat benannt und zurückgegeben ( der Pfad)
damit zum Schluss die Daten in diese Datei geschrieben werden.
"""
datei_name = ("Klimareport_" + str(jahr) + "_" + str(monat) + ".xlsx")
excel_ordner = speicherpfad_pfad.joinpath("Excel_Dateien")
if not excel_ordner.exists():
excel_ordner.mkdir()
if excel_ordner.joinpath(datei_name).exists():
excel_ordner.joinpath(datei_name).unlink() # löscht vorhandene Datei in excel Ordner
if speicherpfad_pfad.joinpath(datei_name).exists():
speicherpfad_pfad.joinpath(datei_name).unlink() # löscht vorhandene datei im Auswertungsordner
muster_original = speicherpfad_pfad.joinpath("Muster Klimazettel MAT.xlsx")
exceldatei = speicherpfad_pfad.joinpath(datei_name)
shutil.copy(muster_original, exceldatei)
return exceldatei, excel_ordner
def daten_in_excel(exceldatei, excelordner, zfg_daten1, zfg_daten2, zfg_daten3, jahr, monat_als_wort):
"""
HINWEIS writer.sheets = {sheet.title: sheet for sheet in writer.book} sorgt dafür das die Daten in einer Arbeits
mappen angehängt da sonst immer eine neue Arbeitsmappe erstellt wird.
Die übergebenen Daten werden in 3 Teile aufgesteilt damit diese vorhandene Formeln in der Excel Datei behindern
"""
df1 = zfg_daten1.iloc[:10]
df1_1 = zfg_daten1.iloc[10:20]
df1_2 = zfg_daten1.iloc[20:]
df2 = zfg_daten2.iloc[:10]
df2_1 = zfg_daten2.iloc[10:20]
df2_2 = zfg_daten2.iloc[20:]
df3 = zfg_daten3.iloc[:10]
df3_1 = zfg_daten3.iloc[10:20]
df3_2 = zfg_daten3.iloc[20:]
datum = pd.Series([jahr])
monat = pd.Series([monat_als_wort])
with pd.ExcelWriter(exceldatei, engine="openpyxl", mode="a") as writer:
writer.sheets = {sheet.title: sheet for sheet in writer.book}
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)
shutil.move(str(exceldatei), excelordner) # shutil.move arbeitet nicht mit path object sondern mit str
return exceldatei
def main(fertigdaten_pfad, speicherpfad_pfad):
ausgelesene_daten = daten_einlesen(fertigdaten_pfad)
jahr, monat_als_wort, monat = datum_fuer_excel(ausgelesene_daten)
winddaten = winddaten_erhalten(ausgelesene_daten)
luft_temp0650 = daten_mit_anderen_zeitindex(ausgelesene_daten,
KANALNUMMER.get("LUFTTEMPERATUR"),
INTERVALLE.get("Uhrzeit_2"))
luft_temp1350 = daten_mit_anderen_zeitindex(ausgelesene_daten,
KANALNUMMER.get("LUFTTEMPERATUR"),
INTERVALLE.get("Uhrzeit_3"))
luft_temp2050 = daten_mit_anderen_zeitindex(ausgelesene_daten,
KANALNUMMER.get("LUFTTEMPERATUR"),
INTERVALLE.get("Uhrzeit_4"))
relativ_luftfeucht0650 = daten_mit_anderen_zeitindex(ausgelesene_daten,
KANALNUMMER.get("RELATIVE_LUFTFEUCHTIGKEIT"),
INTERVALLE.get("Uhrzeit_2"))
relativ_luftfeucht1350 = daten_mit_anderen_zeitindex(ausgelesene_daten,
KANALNUMMER.get("RELATIVE_LUFTFEUCHTIGKEIT"),
INTERVALLE.get("Uhrzeit_3"))
relativ_luftfeucht2050 = daten_mit_anderen_zeitindex(ausgelesene_daten,
KANALNUMMER.get("RELATIVE_LUFTFEUCHTIGKEIT"),
INTERVALLE.get("Uhrzeit_4"))
max_temp = daten_mit_anderen_zeitindex(ausgelesene_daten,
KANALNUMMER.get("MAX_TEMPERATUR"),
INTERVALLE.get("Uhrzeit_1"))
min_temp = daten_mit_anderen_zeitindex(ausgelesene_daten,
KANALNUMMER.get("MAX_TEMPERATUR"),
INTERVALLE.get("Uhrzeit_1"))
sonnenschein = sonnenschein_erhalten(ausgelesene_daten)
niederschlag = daten_mit_anderen_zeitindex(ausgelesene_daten,
KANALNUMMER.get("NIEDERSCHLAG"),
INTERVALLE.get("Uhrzeit_5"))
# zfg = zusammengefasste
zfg_daten1, zfg_daten2, zfg_daten3 = daten_zusammenfassen(winddaten, luft_temp0650, luft_temp1350, luft_temp2050,
relativ_luftfeucht0650, relativ_luftfeucht1350,
relativ_luftfeucht2050, max_temp, min_temp, sonnenschein,
niederschlag)
exceldatei, excelordner = ordner_datei_organisation(speicherpfad_pfad, jahr, monat)
exceldatei = daten_in_excel(exceldatei, excelordner, zfg_daten1, zfg_daten2, zfg_daten3, jahr, monat_als_wort)
return exceldatei
if __name__ == "__main__":
main(fertigdaten, speicherpfad)
3. Hauptdatei: gui
Also eigentlich ist es so das Ich aus der GUI wenn Start gedrückt wird Ich die Funktion main aus dem Module Klimareport augrufen möchte ( da dann die ganze Datei abgearbeitet wird und später die funktion pdf umwandlung aus der Modul Pdf Datei aufrufen möchte nur wie gesagt wenn Ich diese Funktionen direkt in der Datei expliziert importieren möchte geht das nicht ( Pycharm zeigt mir zumindest kein Vorschlag an was Pycharm auf dem Arbeitsrechner jedoch gemacht hat )