Ich versuche herauszufinden, was meiner Meinung nach ein 8-Byte / 64-Bit-Zeitstempel sein sollte.
import datetime
GPS_EPOCH = datetime.datetime(1980, 1, 6)
t1 = "\x00\x00\xBF\x13\xDB\x79\xC0\x00" # expected: 2012-10-04 01:00:51.759
t2 = "\x00\x00\xC0\x13\xDB\x79\xC0\x00" # expected: 2012-10-04 01:00:51.760
t3 = "\x00\x00\xC2\x13\xDB\x79\xC0\x00" # expected: 2012-10-04 01:00:51.763
t4 = "\x00\x00\x80\xE7\xFB\x79\xC0\x00" # expected: 2012-10-04 01:45:40.960
Ich glaube, die Werte, die sich aus t1
und t2
ergeben, sollten vom GPS_EPOCH versetzt werden. Es scheint jedoch nicht möglich zu sein, dass das Ergebnis mit der erwarteten Datumszeit des Ergebnisses übereinstimmt.
Ich habe gelesen und es scheint logisch, dass dies in zwei Teile aufgeteilt wird, wobei einer vielleicht ein Bruchteil und der andere Sekunden (jeweils 4 Bytes?) Ist. Ich habe jedoch keine Referenz für Zeitstempelformate gefunden, die auf der GPS-Epoche basieren.
Irgendwelche Ideen, wie dies in das erwartete Ergebnis umgewandelt werden könnte?
3 Antworten
Ich habe es. Sie haben gerade genug Beispiele geliefert.
>>> t1 = "\x00\x00\xBF\x13\xDB\x79\xC0\x00" # expected: 2012-10-04 01:00:51.759
>>> import struct
>>> import datetime
>>> GPS_EPOCH = datetime.datetime(1980, 1, 6)
>>> t1_unpacked = struct.unpack('<q', t1)[0]
>>> t1_seconds = t1_unpacked / 52428800
>>> t1_us = int(round((t1_unpacked % 52428800) / 52.428800, 0))
>>> GPS_EPOCH + datetime.timedelta(seconds=t1_seconds, microseconds=t1_us)
datetime.datetime(2012, 10, 4, 1, 0, 51, 758750)
Alles zusammen:
def gps_time(timestamp):
unpacked = struct.unpack('<q', timestamp)[0]
seconds = unpacked / 52428800
microseconds = int(round((unpacked % 52428800) / 52.428800, 0))
return GPS_EPOCH + datetime.timedelta(seconds=seconds, microseconds=microseconds)
>>> gps_time(t2)
datetime.datetime(2012, 10, 4, 1, 0, 51, 760000)
>>> gps_time(t3)
datetime.datetime(2012, 10, 4, 1, 0, 51, 762500)
>>> gps_time(t4)
datetime.datetime(2012, 10, 4, 1, 45, 40, 960000)
Sie können mithilfe der {{X0 }} Modul:
>>> import struct
>>> number = struct.unpack('q', "\x00\x00\xBF\x13\xDB\x79\xC0\x00")
>>> "{:,}".format(number)
'54,177,177,364,529,152'
Das ist eine ziemlich große ganze Zahl! Aber hängt es mit der Epoche zusammen, die Sie auflisten? Wahrscheinlich nicht...
Vielleicht ist es keine ganze Zahl. Ich habe ein rohes GPS-Modul, mit dem ich gespielt habe, und seine Daten werden in NMEA-Sätzen als seriell ausgegeben. Informationen zum Format für diese Personen finden Sie online.
BEARBEITET
Entschuldigung, dies ist keine Lösung , nur ein Startpunkt , wenn jemand anderes mehr Zeit hat, sich eingehend mit ihm zu befassen.
Die gespeicherte 'versteckte' Nummer für das erste Datum sollte sein:
import datetime
from datetime import datetime, timedelta
GPS_EPOCH = datetime(1980, 1, 6)
date_1 = datetime(2012,10,04, 01,00,51,759)
d=(date_1 - GPS_EPOCH)
( d.days * 24 * 60 * 60 + d.seconds ) * 1000 + d.microseconds
----> 1.033.347.651.759 <----
Die Nummer, die Sie beim Auspacken des ersten Datenhex-Codes erhalten, lautet jedoch:
struct.unpack('q', "\xBF\x13\xDB\x79\xC0\x00\x00\x00" )[0]
----> 826.678.121.407 <----
Beachten Sie, dass ich \ xBF an die niedrigstwertige Ziffernposition verschiebe. Ich mache das, weil in Ihrer Stichprobe 1 Millisekunde \ xC0 - \ xBF ist. Die niedrigstwertige Ziffer scheint in der ersten Stichprobe \ xBF zu sein.
Für Ihre Datenprobe kann die Formel dann wie folgt lauten:
milliseconds = ( 1033347651759 - 826678121407 ) + unpack_your_string_with_offset
GPS_EPOCH + milliseconds
Testen mit weniger Daten ...
>>> milliseconds = ( 1033347651759 - 826678121407 ) + \
struct.unpack('q', "\xBF\x13\xDB\x79\xC0\x00\x00\x00" )[0]
>>>
>>> GPS_EPOCH + timedelta( milliseconds = milliseconds)
datetime.datetime(2012, 10, 4, 1, 0, 51, 759000)
Bitte veröffentlichen Sie weitere Datenproben und erwartete Ergebnisse, um eine neue Formel zu überprüfen oder daraus zu schließen.
Ich habe die Entpackmethode von @leon_matthews übernommen: +1;)
Ich hoffe, dass ein Raiman die Lösung finden kann. Ich werde Ihrer Antwort folgen.
Verwandte Fragen
Neue Fragen
python
Python ist eine dynamisch typisierte Mehrzweck-Programmiersprache mit mehreren Paradigmen. Es wurde entwickelt, um schnell zu lernen, zu verstehen, zu verwenden und eine saubere und einheitliche Syntax durchzusetzen. Bitte beachten Sie, dass Python 2 ab dem 01.01.2020 offiziell nicht mehr unterstützt wird. Fügen Sie für versionenspezifische Python-Fragen das Tag [python-2.7] oder [python-3.x] hinzu. Wenn Sie eine Python-Variante (z. B. Jython, PyPy) oder eine Bibliothek (z. B. Pandas und NumPy) verwenden, fügen Sie diese bitte in die Tags ein.