xml und asc Files miteinander abgleichen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die offizielle Dokumentation ist unseriös? Abertausende Programmierer haben damit erfolgreich namedtuples eingesetzt. Bei dir Klappt’s nicht, und dann liegt es an allem, aber nicht an dir? Welche Formulierung in dieser unbrauchbaren Dokumentation hat denn deinen Glauben befeuert, ein namedtuple wäre eine Liste?
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@JohannX: Mal davon abgesehen das Du wahrscheinlich kein Python 3.3 mehr einsetzt und damit eine etwas aktuellere Version der Python-Dokumentation hättest wählen sollen, ist der zweite Link auf jeden Fall brauchbar, der sagt nämlich alles was man zu `namedtuple()` wissen muss, inklusive Codebeispielen. Naja, fast alles: Es fehlt natürlich alles was nach Python 3.3 noch dazu gekommen ist. Wovon aber nichts wichtiges für das Grundverständnis und Deinen Code dabei ist.

Nur weil man etwas `liste` nennt, wird es keine. Bei ``vier = 23; eins = 42; print(vier + eins)`` erwartest Du ja hoffentlich auch nicht das da 5 ausgegeben wird. Und wenn es denn eine Liste wäre, wo hättest Du denn dann `append()` aufgerufen um etwas an diese vermeintliche Liste anzuhängen?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

__deets__ hat geschrieben: Mittwoch 31. Juli 2019, 08:12 Die offizielle Dokumentation ist unseriös? Abertausende Programmierer haben damit erfolgreich namedtuples eingesetzt. Bei dir Klappt’s nicht, und dann liegt es an allem, aber nicht an dir? Welche Formulierung in dieser unbrauchbaren Dokumentation hat denn deinen Glauben befeuert, ein namedtuple wäre eine Liste?
Wie ich auf namedtuple gekommen bin ist mir Schleierhaft, konnte das Problem mittlerweile lösen.
Sorry dafür, dass ich noch ein Anfänger bin, werde hier keine Fragen mehr stellen
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das du Anfaenger bist ist kein Grund sich zu entschuldigen. Das du anderen Leuten die Schuld dafuer gibst, dass *DU* etwas missverstanden hast hingegen ist was anderes. *Dafuer* kannst du dich entschuldigen. Musst du nicht. Aber wenn du deinem Frust freien Lauf laesst, dann darf ich das wohl auch, oder?
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

Gut :?
Es ist halt für mich sehr erdrückend wenn man 2 Tage vor dem gleichen Problem sitzt!


Eine Frage hätte ich noch, dann sollte es funktionieren.

Und zwar es soll ein Hexa Wert auf Dezimal Wert umgerechnet werden.
Diesen Code hatte ich schon beim letzten Programm verwendet und das asc file hat sich vom Aufbau nicht geändert, nur sind halt andere Werte vorhanden

Code: Alles auswählen

self.df_all = pd.read_csv(self.file_asc, skiprows=5, delimiter=";", converters={'  DATA L': partial(int, base=16)})
Aber es erscheint diese Fehlermeldung

Code: Alles auswählen

ValueError: invalid literal for int() with base 16: ''
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Da ist offenbar in der Spalte '<ein paar Leerzeichen>DATA L' mindestens eine leere Zeichenkette enthalten. Und nichts kann man nicht in eine Zahl umwandeln:

Code: Alles auswählen

In [1]: int('', base=16)                                                        
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-1-7e47a351e148> in <module>
----> 1 int('', base=16)

ValueError: invalid literal for int() with base 16: ''
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

So sieht z.B. solch eine asc file aus:

Code: Alles auswählen

Start Date;    Time;       Offset[s];      ID;  DATA H;  DATA L;
27.03.2019;17:18:26;000000000.001000;AEx;00000000;20F76D2;
27.03.2019;17:18:26;000000000.001300;2200000x;700017E9;20F76D2;
Man kann hier erkennen, dass eine Zeile kürzer ist. Daran wird der Fehler liegen.
Dachte dass mit dem delimiter=";" das soweit getrennt wird und somit kein Problem darstellen sollte...

Jetzt muss ich quasi mit ner for-Schleife Zeile für Zeile durchgehen und alle Zeilen löschen welche AEx enthalten oder? Außer es gibt ne andere Lösung?
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Daran liegt es nicht, weil beide Zeilen gleich viele ; haben und keine leeren Zellen.
Du hast aber irgendwo in der Datei eine leere Zelle, also ein ;; .
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

Laut Notepad++ gibt es nichts mit ";;".
Sehr interessant
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Naja eben ein ';' direkt gefolgt von einem Zeilenende weil es sich um die letzte Spalte handelt. Ein bisschen Nachdenken…

Das `skipinitialspace`-Argument von `pandas.read_csv()` hatte ich glaube ich schon mal erwähnt, oder?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

__blackjack__ hat geschrieben: Mittwoch 31. Juli 2019, 16:01 Naja eben ein ';' direkt gefolgt von einem Zeilenende weil es sich um die letzte Spalte handelt. Ein bisschen Nachdenken…

Das `skipinitialspace`-Argument von `pandas.read_csv()` hatte ich glaube ich schon mal erwähnt, oder?
Das `skipinitialspace`-Argument hast du nicht erwähnt meines Wissens nach.
Habe dieses gefunden:

Code: Alles auswählen

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html
Liegt es quasi daran weil in den Zeilen AEx leere Zeilen gibt?
Ich versteh den Fehler leider nicht ganz.

Code: Alles auswählen

ValueError: invalid literal for int() with base 16: ''


Diesen Code habe ich beim vorherigen Projekt genommen:

Code: Alles auswählen

self.df_all = pd.read_csv(self.file_asc, skiprows=5, delimiter=";", converters={'  DATA L': partial(int, base=16)})
Und die asc Datei war:

Code: Alles auswählen

Start Date;    Time;       Offset[s];      ID;  DATA H;  DATA L;
09.07.2019;13:35:24;000000000.002400;2200000x;20F76D2;00000000;
09.07.2019;13:35:24;000000000.002700;9900011x;20F76D2;000009EA;
Und mit der anderen asc Datei geht das nicht?

Code: Alles auswählen

Start Date;    Time;       Offset[s];      ID;  DATA H;  DATA L;
27.03.2019;17:18:26;000000000.001000;AEx;00000000;20F76D2;
27.03.2019;17:18:26;000000000.001300;2200000x;700017E9;20F76D2;
Mir ergibt sich einfach keine Logik :( vielleicht denke ich auch Falsch?

Code: Alles auswählen

skipinitialspace = True
Wäre das dann der Richtige Code den ich hinzufügen muss?
Bzw. mit

Code: Alles auswählen

converters={'  DATA L': partial(int, base=16)})
austauschen muss
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

Ich nehm´s zurück! Hab´s hinbekommen :)
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Skipinitialspace hat nichts mit deinem Problem zu tun. In der Dokumentation steht doch, dass damit die Leerzeichen nach dem Trenner ignoriert werden. Das verwendet man, damit Spalten und Werte vernünftig dargestellt werden. Eine beliebige Anzahl von Leerzeichen vor der Spaltenbezeichnung ist nicht nur unschön sondern auch fehleranfällig.

Was genau verstehst du denn an der Fehlermeldung nicht? Du versucht ein leere Zeichenkette in eine Zahl umzuwandeln. Das funktioniert natürlich nicht. Die Werte in deiner Datei sind durch Semikolon getrennt. Du willst den 6. Wert aus den Zeilen haben. Dann sag mir mal den 6. Wert aus der 2. Datenzeile deiner nicht funktionierenden Datei.
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

Ich hab das dann eh soweit verstanden, hab nur 10min mehr gebraucht.
Jetzt läuft der Code mal soweit durch, ohne dass Fehlermeldung kommen :)


Jetzt habe ich nur mehr ein Problem mit dem plotly und dann sollte es soweit sein 8)
Es wird ein html File exportiert und automatisch im Browser geöffnet, doch anscheinend sind keine Daten vorhanden, der Code ist quasi der selbe vom vorherigen Projekt, bei dem hat es allerdings funktioniert.

Das ist der Code vom vorherigen Projekt:

Code: Alles auswählen

self.fig = go.Figure()
                # Das Layout für das Diagramm erstellen
                self.fig.update_layout(title = go.layout.Title(text = file_title, xref = "paper", x = 0), 
                xaxis = go.layout.XAxis(title = go.layout.xaxis.Title(text = "Second [s]", font = dict(family = "Courier New, monospace", size = 20, color = "#7f7f7f"))), 
                yaxis = go.layout.YAxis(title=go.layout.yaxis.Title(text = "Values", font = dict(family = "Courier New, monospace", size = 20, color = "#7f7f7f"))))

                # Fügt ubatlogger zum Diagramm hinzu
                if self.ui.ubatlogger.isChecked():
                    self.fig.add_trace(go.Scatter(x = time_ubatlogger, y = values_ubatlogger, mode = "lines", name = "Ubatlogger"))
Das ist der neue Code:

Code: Alles auswählen

self.fig = go.Figure()
         # Das Layout für das Diagramm erstellen
         self.fig.update_layout(title = go.layout.Title(text = file_title, xref = "paper", x = 0), 
         xaxis = go.layout.XAxis(title = go.layout.xaxis.Title(text = "Second [s]", font = dict(family = "Courier New, monospace", size = 20, color = "#7f7f7f"))), 
         yaxis = go.layout.YAxis(title=go.layout.yaxis.Title(text = "Values", font = dict(family = "Courier New, monospace", size = 20, color = "#7f7f7f"))))

         if self.ui.checkBox_1.isChecked():
            self.fig.add_trace(go.Scatter(x = time_Name_1, y = values_Name_1, mode = "lines", name = self.list[0][0]))
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Ich würde schauen, ob self.ui.checkBox_1.isChecked() tatsächlich True ist (sonst wird kein Trace hinzugefügt) und schauen ob in time_Name_1 und values_Name_1 tatsächlich das drin steht, was du erwartest.
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

Das sind die Ergebnisse

Code: Alles auswählen

            time_Name_1 = df_Name_1["Offset[s]"]
            print(time_Name_1)
            values_Name_1 = df_Name_1["DATA L"].apply(lambda v: self.list[0][1])
            print(values_Name_1)
            
            if self.ui.checkBox_1.isChecked():
                   print("Checkbox is True")

Code: Alles auswählen

Series([], Name: Offset[s], dtype: float64)
Series([], Name: DATA L, dtype: object)
Checkbox is True
Checkbox ist True soweit ist hier kein Problem.
Wird dann also daran liegen dass keine Daten in den Variablen sind?
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

Hier sind noch weitere Daten, wo ich auf Kontrolle ging:

Code: Alles auswählen

         self.df_all = pd.read_csv(self.file_asc, skiprows=5, delimiter=";", skipinitialspace = True, converters={'   DATA L': partial(int, base=16)})
         print(self.df_all)
Ausgabe:

Code: Alles auswählen

        Start Date      Time  Offset[s]        ID    DATA H    DATA L  Unnamed: 6
0       27.03.2019  17:18:26     0.0010       AEx  00000000  20F76D2       NaN
1       27.03.2019  17:18:26     0.0013  2200000x  700017E9  20F76D2         NaN
2       27.03.2019  17:18:26     0.0016  DD00011x  8002019E  20F76D2         NaN
3       27.03.2019  17:18:26     0.0019  DD00011x  8002019E  20F76D2         NaN
4       27.03.2019  17:18:26     0.0045  1100001x  800A7229 20F76D2         NaN
...            ...       ...        ...       ...       ...       ...         ...
627503  27.03.2019  17:18:26  2536.6235  1100001x  800A7229  20F76D2         NaN
627504  27.03.2019  17:18:26  2536.6238  1100001x  800A7279  00000002         NaN
627505  27.03.2019  17:18:26  2536.6241  1100001x  800A7319  00000002         NaN
627506  27.03.2019  17:18:26  2536.6244  1100001x  800A73B9  00000002         NaN
627507  27.03.2019  17:18:26  2536.6296  DD00011x  8002019E  20F76D2         NaN
[627508 rows x 7 columns]
Empty DataFrame
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

Ich bin dem Rätsel auf der Spur!
Das habe ich als Code hinzugefügt:

Code: Alles auswählen

            df_Name_1 = self.df_all[self.df_all["DATA H"] == self.list[0][2]]
            print(df_Name_1)
Das Ergebniss:

Code: Alles auswählen

Empty DataFrame
Columns: [Start Date, Time, Offset[s], ID, DATA H, DATA L, Unnamed: 6]
Index: []
Hier scheint es also, dass nichts vorhanden ist?

Edit: beim alten erscheint genau die selbe Meldung und da sind aber Daten im plotly erhalten!
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Was ist der Wert von self.list[0][2]?

Der Name ist übrigens schlecht gewählt, weil es das Schlüsselwort "list" überschreibt. Das verwirrt unnötig.
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

Gut, also ich weiß schon wo der Fehler liegt, sollte auch in der Richtigen Spalte nachschauen :lol:
Nun wird geplotet 8)

Eine kleine Sache wäre da noch, dann klapp´s bestimmt!
Bei diesem Code:

Code: Alles auswählen

values_Name_1 = df_Name_1["DATA L"].apply(lambda v: self.liste[0][1])
ist bei lambda v folgender Wert enthalten:

Code: Alles auswählen

v*(5/1024)*9.980487805
Beim ploten glaubt plotly also dass das schon der gegebene Wert ist, aber dieser Wert soll mit dem Wert welcher in der asc File geben ist Berechnet werden!

Ein Wert in dieser Tabelle "DATA L" ist z.B: 000000DF
Und genau dieser Wert 000000DF wird ja mit diesem Code in decimal umgerechnet:

Code: Alles auswählen

         self.df_all = pd.read_csv(self.file_asc, skiprows=5, delimiter=";", skipinitialspace = True, converters={'   DATA L': partial(int, base=16)})
Aber wenn ich den Code ausführe kommt diese Fehlermeldung:

Code: Alles auswählen

TypeError: can't multiply sequence by non-int of type 'float'
Antworten