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.
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: 4183
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: 4183
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: 4183
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'
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@JohannX: Da wird nichts umgewandelt weil es den in `converters` angegeben Spaltennamen nicht geben kann wenn `skipinitialspace` gesetzt ist.

Wenn man statt der unverständlichen Indexwerte Namen verwenden würde, zum Beispiel bei einem `namedtuple`, fällt das auch eher auf wenn man einen Index daneben liegt, eben weil man dann sinnvolle, verständliche Namen stattdessen hätte…
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

Ist mir auch grad aufgefallen, aber wenn ich den Code jetzt richtig annehme:

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)})
Kommt wieder diese Fehlermeldung raus:

Code: Alles auswählen

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

Wobei ich diesen Code von meinem Vorgänger übernommen habe und ich nicht wirklich weiß was genau das macht:

Code: Alles auswählen

from functools import partial
converters={'DATA L': partial(int, base=16)}
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und hast du mal die Dokumentation von functools.partial angeschaut, um der Frage auf den Grund zu gehen, was das genau macht? In der steht ua genau der Fall den du hier hast als Beispiel (fuer binaer- statt hexadezimal-Zahlen) zur Erklaerung.
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@JohannX: In der Spalte ist, wie schon mal gesagt, mindestens eine Zelle leer…
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@JohannX: was passiert Deine Meinung nach eigentlich hier:

Code: Alles auswählen

values_Name_1 = df_Name_1["DATA L"].apply(lambda v: self.liste[0][1])
Benutzeravatar
snafu
User
Beiträge: 6736
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Man darf übrigens bei Fragen zu einem komplett neuen Thema gern einen neuen Thread aufmachen. Mit XML hat das hier ja schon lange nichts mehr zu tun...

EDIT: Achso, das steht nun mit der vorliegenden ASC-Datei in Zusammenhang. Es ist trotzdem unschön für spätere Leser, wenn man einen Sammelthread für all seine Fragen bezüglich eines Projektes aufmacht. Denn dann muss auch viel uninteressanter Kram durchforstet werden. Daher bei der Nutzung des Forums vielleicht nicht nur sich selbst sehen, sondern auch die Nutzergemeinschaft im Blick haben. Das wäre sehr nett. :)
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

kbr hat geschrieben: Donnerstag 1. August 2019, 17:18 @JohannX: was passiert Deine Meinung nach eigentlich hier:

Code: Alles auswählen

values_Name_1 = df_Name_1["DATA L"].apply(lambda v: self.liste[0][1])
Also meines Wissens nach wird hier self.liste[0][1] diese Formel eingesetzt v*(5/1024)*9.980487805
Das .apply Berechnet den Wert zu welcher sich in df_Name_1["DATA L"] befindet
Das ganze wird dann in eine neue Variable gespeichert
Denke dass das so Richtig ist.
Benutzeravatar
sparrow
User
Beiträge: 4183
Registriert: Freitag 17. April 2009, 10:28

Das schöne an Python ist, dass man gar nicht 'denken' (im Sinne von vermuten) muss, man kann das einfach ausprobieren.
Befinden sich denn hinterher die korrekten Daten in values_Name_1? So wie du sie erwartest?
Ich sehe zumindest nicht, warum die von dir genannte Formel dort eingesetzt werden sollte. Was ist denn der Wert von self.liste[0][1] (der Name ist noch immer schlecht, das mit den Indexzugriffen auch. Wäre das gut gelöst, müsste man das nicht zum 18 Mal fragen).
JohannX
User
Beiträge: 110
Registriert: Mittwoch 27. März 2019, 17:07

Aber ich habe jetzt in de asc File herausgefunden warum das so nicht hinhaut:
Es ist ein Error enthalten
ErrorFrames: 0 6611826 1 0 0 12
Das dürfte mir den Fehler verursachen...

Also muss ich vorher die asc File nach solchen leeren Zeilen durchsuchen und entfernen.
Dieser Vorgang sollte korrekt sein
Benutzeravatar
sparrow
User
Beiträge: 4183
Registriert: Freitag 17. April 2009, 10:28

Es wird spätestens an der von snafu angesprochenen Stelle nicht mehr korrekt sein.
Antworten