Schreiben und Lesen Datetime binary-format in Python
Ich wollen speichern Sie eine Liste von datetimes in eine binäre Datei in Python.
EDIT: von "binary" ich meine, die beste digitale Darstellung für jeden Datentyp. Die Anwendung HIERFÜR ist zum speichern von GPS-Track-Punkte, komponiert von (unix-timestamp, Breitengrad, Längengrad, Höhe), so ist die ganze Struktur ist little-endian "Long, float, float, float", mit vier bytes pro Wert.
HINWEIS: ich benutze nicht die "unix-timestamp" aufgrund einer zuneigung zu den Unix-Plattform, sondern nur eine eindeutige Möglichkeit dar, den Wert einer datetime.
Derzeit bin ich dabei, wie Sie den code unten, aber neben einigen Zeitzone Verwirrung, ich bin immer noch dabei, (meine Zeitzone -3), ich glaube, dass die Umwandlung zu int
- und zurück vielleicht nicht der richtige Weg sein, da datetime
und datetime64
werden native Typen, die in python/numpy, wenn ich mich nicht Irre. So ein datetime64
müssten acht bytes, statt der vier, die ich benutze für die (lange)unix-timestamp.
import datetime
import calendar
import struct
now = datetime.datetime.now()
print now
stamp = calendar.timegm(now.utctimetuple())
print stamp
binarydatetime = struct.pack('<L', stamp)
recoverstamp = struct.unpack('<L', binarydatetime)[0]
print recoverstamp
recovernow = datetime.datetime.fromtimestamp(recoverstamp)
print recovernow
Also die wichtigste Frage ist: "ist das die pythonic way-Konvertierung von naiven datetime in Binär und zurück?"
Und die zweite Frage ist: "wenn alles, was in diesem code sollte so naiv sein, warum habe ich eine timezone offset?"
Vielen Dank für das Lesen!
- Definieren 'binary' hier. Was andere software erwarten Sie für die Zusammenarbeit mit? Es gibt keine standard -, pro se, speichern datetime in binären Formaten, die meisten software-wählen Sie Ihre eigene bevorzugte format, die möglicherweise oder möglicherweise nicht werden, basierend auf der UNIX-Epoche.
- Ich möchte die Datentypen werden in eine Datei geschrieben in einer Sprache und Plattform-unabhängige Weise. Siehe mein edit!
- betrachten sqlite-Datenbank, die als portable Binärformat zum speichern von gps-Track-Punkte mit der systemeigenen datetime-Typ für die utc - (oder gps -) Zeit.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich einen Weg gefunden, mit dem Unix-timestamp /Zeitstempel und speichert diese als integer. Dies funktioniert für mich, weil ich nicht brauchen, ein subsecond Auflösung, aber ich denke, lange Ganzzahlen, die erlauben würde, für Mikrosekunden-Auflösung, mit einigen änderungen des Codes.
Änderungen, die sich aus meiner ursprünglichen bestehen im Austausch
calendar.timegm
durchtime.mktime
und auchutctimetuple
durchtimetuple
zu halten alles, was naiv.Diese:
Gibt diese:
Aus diesem kann ich problemlos schreiben, die verpackt
binarydatetime
auf Datei, und Lesen Sie es später wieder.Wenn Sie möchten, speichern Sie ein Objekt, um eine binäre Datei, Sie können darüber nachdenken Gurke
Soweit ich weiß, es schreibt ein byte-stream, so dass es binary genug, aber das Ergebnis ist
Außerdem denke ich, sollte es mit datetime.
Und Sie haben diese für das speichern:
Und diese für die Wiederherstellung
datetime
Daten geben. Siehe mein edit.datetime.datetime
Objekt: docs.python.org/2/library/datetime.html#datetime.datetimeBei weitem die einfachste Lösung ist die Verwendung Temporenc: http://temporenc.readthedocs.org/
Er kümmert sich um alle die Kodierung/Dekodierung und ermöglicht es Ihnen zu schreiben, ein Python-datetime-Objekt in eine Datei:
Lesen Sie es wieder, das genügt: