Dictionary in nach Excel exportieren

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
OWT
User
Beiträge: 29
Registriert: Montag 20. Juni 2022, 10:45

Hallo Zusammen

Ich hab ein Dictionary mit unterschiedlich langen Einträgen. Nun sollte ich die Daten in ein Excel übertragen, wobei jeder Eintrag im Dict eine Spalte im Excel werden soll.
Leider finde ich im Netz nur Vorschläge die über Pandas funktionieren. Mit Pandas besteht aber das Problem, dass dir Einträge unterschiedlich lang sind.

Vermutlich stell ich mich nur an, trotzdem hab ich gehofft, dass mich hier vll jemand in die richtige Richtung lenken kann.

Schönes Wochenende
Tob

Code: Alles auswählen

bsp_dict = {'2022-07-14--15-58-44': [1.7545, 1.675, 1.7112, 1.2049, 1.6499, 1.6469, 1.6163], '2022-07-14--16-10-31': [1.1444, 1.5916, 1.6256, 1.6605], '2022-07-14--17-59-32': [1.891, 1.8976, 1.5383, 1.5015, 1.5259, 1.9505, 2.0353, 1.9759, 1.8494]}
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Eine CSV-Datei mit unterschiedlich vielen Werten pro Zeile ist eigentlich Quatsch. Darum ist das auch nicht unterstuetz. Natuerlich geht das technisch, aber es ist eben wenig sinnvoll.

Du hast zwei Moeglichkeiten:

- erweitere die zu kurzen Daten mit Dummy-Eintraegen, die passend sind. 0, -1, None waeren Kandidaten. Und benutze dann zB pandas.
- schreibe die CSV-Datei komplett selbst, mit den ueblichen Dateioperationen.

Was besser ist, musst du entscheiden.

Code: Alles auswählen

SEPARATOR = ";"

def main():

    bsp_dict = {'2022-07-14--15-58-44': [1.7545, 1.675, 1.7112, 1.2049, 1.6499, 1.6469, 1.6163], '2022-07-14--16-10-31': [1.1444, 1.5916, 1.6256, 1.6605], '2022-07-14--17-59-32': [1.891, 1.8976, 1.5383, 1.5015, 1.5259, 1.9505, 2.0353, 1.9759, 1.8494]}

    with open("/tmp/output.csv", "w") as outf:
        for date, values in sorted(bsp_dict.items()):
            row_data = [date] + [str(v) for v in values]
            outf.write(SEPARATOR.join(row_data))
            outf.write("\n")

if __name__ == '__main__':
    main()
OWT
User
Beiträge: 29
Registriert: Montag 20. Juni 2022, 10:45

Danke für die Antwort!

Der Code Funktioniert, wobei ich Spalten und Zeilen noch tauschen möchte. Aber ich befürchte, dass ich hier in noch mehr Probleme renne, spätestens wenn ich mehr Infos dazu schreiben will.
Die zu kurzen Messreihen um "None" zu erweitern würde gehen, daran hatte ich nicht gedachte, danke. Mal schauen ob ich hier einen schnellen Befehl finde.


Edit
Warum verwendest du "sorted()"? Die Reihenfolge darf sich nicht ändern.
Und mir ist grad aufgefallen, dass die Daten falsch sind, aus 1,7545 wurde 17545 und aus 1.675 wurde 1675. Ein Grund mehr für Auffüllen und Pandas verwenden :)

Mehr Hintergrund
Etwas Quatsch ist es schon, aber ich glaub es hilft nicht :)
Initial liegen die Daten als PDF vor, wobei jede Messreihe ein PDF ist. Am Ende hätte ich gern eine Excel Datei, in welcher jeder Messreihe eine Spalte ist. Weil nicht immer gleichviele Messwerte pro Messreihe gemacht werden (z.B. Messpunkt Wiederholung) sind die eben unterschiedlich lang.
Die PDFs enthalten auch Infos zu den Messparametern. Langfristig stelle ich mir ein Excel vor, welches in der ersten Spalte die Beschriftungen hat (Dateiname, Messzeit, Operator, Uhrzeit, Messpunkt 1 bis Messpunkt n) und die weiteren Spalten dann jeweils die Infos der PDFs sind. Aber so weit bin ich noch länger nicht.
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

OWT hat geschrieben: Freitag 15. Juli 2022, 11:44 Und mir ist grad aufgefallen, dass die Daten falsch sind, aus 1,7545 wurde 17545 und aus 1.675 wurde 1675.
Ich vermute, dass du Excel verwendest, um dir die CSV anzusehen. Leider macht Excel da was es will und erkennt z. B. nicht, dass der Dezimaltrenner ein Punkt "." ist und erwartet stur ein Komma. In der Datei wird die Zahl vermutlich korrekt sein - das siehst du, wenn du sie mit einem Texteditor öffnest.
Wenn die Daten sich in den Messreihen unterscheiden, dann füge doch eine Spalte für die Messreihe hinzu:

Code: Alles auswählen

Zeitstempel;Messreihe;Wert
1657884986.800915;1;5.678
1657884989.800915;1;3.45
1657887986.800915;2;4.67
1657887987.800915;2;8.67
Das Format ist dafür ausgelegt, dass Zeilen ergänzt werden - nicht Spalten. Wenn du diese dann in einzelnen Spalten in einer echten Excel-Datei darstellen willst, kannst du das ja immer noch machen.
OWT
User
Beiträge: 29
Registriert: Montag 20. Juni 2022, 10:45

Das ganze soll in Excel, damit es anschließend "klassisch" ausgewertet und hergezeigt werden kann. Aktuell kopiert und formatiert man dazu händisch die Werte aus den PDFs.

Was genau da mit den Werten passiert finde ich grad extrem spannend. Im bsp_dict waren es noch floats, aber in dem Beispielcode von deets scheint es notwendig, diese in Strings zu verwandeln. Dass Excel dann die "Punkte" einfach ignoriert, find ich spannend.

Ich glaub ich lass die Idee mit dem Dict mal gut sein und konzentrier mich darauf, was man aus Pandas raus holen kann. Vielleicht gibt es eine Funktion, wie ich Panda Dataframes sukzessive in eine Excel Datei (.xlsx) anreihen kann.

Ich meld mich nochmal, wenn ich was finde mit dem ich glücklich werd :)
Schönes Wochenende
Benutzeravatar
__blackjack__
User
Beiträge: 13007
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@OWT: Die Punkte werden als ”Tausendertrenner” bei ”deutschem” Excel ignoriert. Dafür müssen sie nicht zwingend an den richtigen Stellen stehen. Bei ”englischem” Excel wäre das die Aufgabe der Kommas, die dann einfach ignoriert würden.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten