Typkonvertierung eines Zeitstempels

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.
Antworten
Jonas_12
User
Beiträge: 3
Registriert: Mittwoch 23. August 2023, 16:09

Hallo an alle Python-Programmierer.

Ich habe versucht mit einem Python-Programm automatisch die Zeitstempel aus einer .tdms Datei (LabView-Datei) auszulesen, zu konvertieren & als eine .xlsx Datei (Excel-Datei) wieder abzuspeichern.

Allerdings ist die Uhrzeit im Zeitstempel der konvertierten Excel-Datei komischerweise immer genau 2 Stunden früher als in der tdms-Datei.
Hier ein Beispiel: Die Uhrzeit bzw. der Datums-Zeitstempel im tdms File beträgt: "19.06.2023 04:21:06,391 PM" im 12h Format.

Hier mein Code zur Konvertierung:

Code: Alles auswählen

  # Daten in Excel-Datei schreiben.
            with pd.ExcelWriter(xlsx_output_path) as writer:
                for df_list, sheet_name in zip([sm_states_data_frames],
                                               ['SM States']):
                    for i, df in enumerate(df_list):
                        if 'Timestamp' in df.columns:
                      	  df['Timestamp'] = df['Timestamp'].apply(lambda x: x.strftime('%d.%m.%Y %I:%M:%S,%f %p'))
                        df.to_excel(writer, sheet_name=sheet_name, index=False)
                        

Wenn ich nun mit den oben gezeigten Codezeilen im 12h Format versuche die "Timestamp" Daten in eine .xlsx Datei zu schrieben, kommt dabei das Problem mit den 2 Stunden Zeitversatz heraus:

Sprich der Datums-Zeitstempel der generierten Excel-Datei sieht so aus: "19.06.2023 02:21:06,390650 PM"
Man muss hier noch beachten, dass nach dem Komma 6 Stellen vorhanden sind, da hier Mikrosekunden angezeigt werden statt Millisekunden. Aber ich gehe mal nicht davon aus, dass das die Ursache meines 2 Stunden Versatz Problems ist
Das gleiche Problem habe ich übrigens auch wenn ich versuche den Zeitstempel in ein 24h Format umzuwandeln.
Ich habe das Ganze auch schon mit verschiedenen .tdms Files mit verschiedenen Uhrzeiten getestet. Immer wieder das gleiche Problem.

Hier noch das Format der "Timestamp"-Zellen der tdms Ursprungsdatei: TT.MM.JJJJ hh:mm:ss,000 AM/PM
Es handelt sich also um ein Benuterdefiniertes Format.


Ich wäre sehr dankbar, wenn mir hier jemand weiter helfen könnte!

Viele Grüße!

Jonas
Sirius3
User
Beiträge: 18273
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast offensichtlich Probleme mit Zeitzonen, bzw. deren richtigen Interpretation.
Wie sehen denn Deine Inputdaten aus, wie der Dataframe? Welchen Typ haben die Spalten?
Warum wandelst Du die Zeitpunkte überhaupt in Strings um? Excel hat sowas ähnliches wie einen Datumstyp.
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Beide ``for``-Schleifen sehen falsch aus. `zip()` mit zwei Listen die jeweils genau *ein* Element enthalten ist kompletter Unsinn.

Und in der inneren ``for``-Schleife wird `i` nicht verwendet, und immer wieder das gleiche Arbeitsblatt überschrieben. Oder lauter Arbeistblätter mit dem gleichen Namen angelegt, was nicht sein dürfte. Oder auch die Schleife ist kompletter Unsinn weil es sowieso nur einen DataFrame gibt. Dann wäre das erste Argument von `zip()` eine Liste mit immer genau einem Element, was eine Liste (oder Sequenz) mit immer genau einem Element ist.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Jonas_12
User
Beiträge: 3
Registriert: Mittwoch 23. August 2023, 16:09

Sirius3 hat geschrieben: Mittwoch 23. August 2023, 20:23 Du hast offensichtlich Probleme mit Zeitzonen, bzw. deren richtigen Interpretation.
Wie sehen denn Deine Inputdaten aus, wie der Dataframe? Welchen Typ haben die Spalten?
Warum wandelst Du die Zeitpunkte überhaupt in Strings um? Excel hat sowas ähnliches wie einen Datumstyp.
Hallo Sirius,

danke für den Hinweis. Daran habe ich gar nicht gedacht, dass hier ein Zeitzonenproblem vorliegen kann. Ich habe auch keine Zeitzone im Code definiert. Das könnte dann natürlich sein, dass auf meinem Rechner standartmäßig eine andere Zeitzone wie in den TDMS Dateien hinterlegt ist.
Zu deinen Fragen: Das Format und die Struktur der Inputdaten (Zeitstempel) aus dem .tdms File habe ich oben schon kurz erwähnt. Denke aber damit gibt es kein Problem, dank deinem Tipp. :wink:
Und ich wandele hier nur in einen String um, weil ich auch die Millisekunden brauche. Hierzu habe ich kein Excel Datentyp gefunden.
Zuletzt geändert von Jonas_12 am Mittwoch 23. August 2023, 23:04, insgesamt 1-mal geändert.
Jonas_12
User
Beiträge: 3
Registriert: Mittwoch 23. August 2023, 16:09

__blackjack__ hat geschrieben: Mittwoch 23. August 2023, 20:54 Beide ``for``-Schleifen sehen falsch aus. `zip()` mit zwei Listen die jeweils genau *ein* Element enthalten ist kompletter Unsinn.

Und in der inneren ``for``-Schleife wird `i` nicht verwendet, und immer wieder das gleiche Arbeitsblatt überschrieben. Oder lauter Arbeistblätter mit dem gleichen Namen angelegt, was nicht sein dürfte. Oder auch die Schleife ist kompletter Unsinn weil es sowieso nur einen DataFrame gibt. Dann wäre das erste Argument von `zip()` eine Liste mit immer genau einem Element, was eine Liste (oder Sequenz) mit immer genau einem Element ist.
Hallo blackjack,

mag sein, dass man diesen Part auch hätte anders lösen können, aber die Schleifen sind nicht falsch. Das Programm funktioniert. Es ist ja nur ein Codeausschnitt. Insgesamt lese ich aus ca. 30 Tabellenblättern mehrere Datenframes pro Tabellenballt aus. Die Schleife erfüllt schon ihren Zweck. Es geht lediglich um das Ausgabeformat des Datumstempels. Es ließt einfach aus der Registerkarte "SM States" alle Timestamps aus und schreibt sie in einer Excel untereinander in eine Spalte. Die Info von Sirius scheint mir hier das Problem zu sein. Trotzdem danke.
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Jonas_12: Also die äussere ``for``-Schleife ist falsch. Es ist nicht alles richtig was funktioniert. Man kann statt einer Sicherung auch einfach einen Draht einbauen oder einen Nagel mit dem Griff von einem Schraubendreher in die Wand kloppen. Das funktioniert, ist aber beides falsch.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Nochmal zur inneren ``for``-Schleife. Mal schauen was passiert wenn man mehrere DataFrames unter dem gleichen Arbeitsblatt abspeichert:

Code: Alles auswählen

#!/usr/bin/env python3
import pandas as pd


def main():
    data = pd.DataFrame({"Test": [0] * 5})
    with pd.ExcelWriter("test.xlsx") as writer:
        for i in range(3):
            data["Test"] = i
            data.to_excel(writer, sheet_name="Sheet1", index=False)


if __name__ == "__main__":
    main()
Wenn ich die Datei jetzt in der Tabellenkalkulation öffne, dann ist da *ein* Arbeitsblatt (Sheet1) mit einer Spalte die fünf Zeilen mit dem Wert 2 enthält, also nur der letzte geschriebene `DataFrame`. Die Werte von den Schleifendurchläufen davor sind im Nirwana verschwunden. Die innere Schleife ist also auch falsch.

Alle Arbeitsblätter mit Pandas einlesen → das gleiche Ergebnis:

Code: Alles auswählen

In [230]: pd.read_excel("test.xlsx", sheet_name=None)
Out[230]: 
{'Sheet1':    Test
 0     2
 1     2
 2     2
 3     2
 4     2}
Laut TDMS-Dokumentation werden Zeitstempel als UTC gespeichert:
Timestamps in TDMS files are stored as a structure of two components:
  • (i64) seconds: since the epoch 01/01/1904 00:00:00.00 UTC (using the Gregorian calendar and ignoring leap seconds)
  • (u64) positive fractions: (2^-64) of a second
Was ja auch Sinn macht um mehrdeutige Werte zu vermeiden und unabhängig von irgendwelchen Gebietseinstellungen auf Geräten zu sein.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten