From a5b49e99f7e541992541367f98823fc4e20cf884 Mon Sep 17 00:00:00 2001 From: Jan Date: Thu, 10 Jul 2025 19:56:29 +0200 Subject: [PATCH] CSVVisualizer.py aktualisiert (D) Float error --- CSVVisualizer.py | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/CSVVisualizer.py b/CSVVisualizer.py index a39cb89..0f9969c 100644 --- a/CSVVisualizer.py +++ b/CSVVisualizer.py @@ -87,7 +87,7 @@ class CSVVisualizer: f"Capacity: {test_params.get('Battery Capacity', 'N/A')} | " f"Current: {test_params.get('Test Current', 'N/A')}" ) - + try: # Lese nur Datenzeilen (ignoriere Kommentare und leere Zeilen) skip_rows = 0 @@ -97,9 +97,19 @@ class CSVVisualizer: break skip_rows += 1 + # Bestimme die letzte Datenzeile (ignoriere alles nach '# TEST SUMMARY') + with open(filepath, 'r') as f: + lines = f.readlines() + end_row = len(lines) + for i, line in enumerate(lines): + if line.startswith('# TEST SUMMARY'): + end_row = i + break + self.df = pd.read_csv( filepath, skiprows=skip_rows, + nrows=end_row - skip_rows - 1 if end_row > skip_rows else None, dtype={ 'Time(s)': 'float32', 'Voltage(V)': 'float32', @@ -109,7 +119,8 @@ class CSVVisualizer: 'Charge_Capacity(Ah)': 'float32', 'Coulomb_Eff(%)': 'float32', 'Cycle': 'int32' - } + }, + on_bad_lines='warn' ) # Bereinige die Daten @@ -118,29 +129,39 @@ class CSVVisualizer: self.file_label.config(text=os.path.basename(filepath)) self.status_var.set(f"Daten geladen: {len(self.df)} Messungen") self.update_plot() - + except Exception as e: messagebox.showerror("Fehler", f"Fehler beim Laden:\n{str(e)}") self.status_var.set("Fehler beim Laden") def clean_data(self): """Bereinigt die Daten und füllt fehlende Werte""" + if self.df.empty: + return + # Bereinige Phasen-Namen self.df['Phase'] = self.df['Phase'].str.strip() # Entferne Zeilen mit komplett leeren Werten self.df.dropna(how='all', inplace=True) - # Fülle fehlende Spannung/Strom Werte mit linearen Interpolation - self.df['Voltage(V)'] = self.df['Voltage(V)'].interpolate(method='linear') - self.df['Current(A)'] = self.df['Current(A)'].interpolate(method='linear') + # Fülle fehlende numerische Werte mit linearen Interpolation + numeric_cols = ['Time(s)', 'Voltage(V)', 'Current(A)', + 'Discharge_Capacity(Ah)', 'Charge_Capacity(Ah)', + 'Coulomb_Eff(%)'] + for col in numeric_cols: + if col in self.df.columns: + self.df[col] = pd.to_numeric(self.df[col], errors='coerce') + self.df[col] = self.df[col].interpolate(method='linear') # Fülle fehlende Phasen mit der letzten bekannten Phase - self.df['Phase'].fillna(method='ffill', inplace=True) + if 'Phase' in self.df.columns: + self.df['Phase'].fillna(method='ffill', inplace=True) # Stelle sicher, dass die Zeit monoton steigend ist - self.df.sort_values('Time(s)', inplace=True) - self.df.reset_index(drop=True, inplace=True) + if 'Time(s)' in self.df.columns: + self.df.sort_values('Time(s)', inplace=True) + self.df.reset_index(drop=True, inplace=True) def update_plot(self): """Aktualisiert den Plot mit den aktuellen Daten"""