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?

4
monkut 10 Okt. 2012 im 11:56

3 Antworten

Beste Antwort

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)
8
Mark Ransom 11 Okt. 2012 im 02:57

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.

2
leon_matthews 10 Okt. 2012 im 09:04

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.

1
dani herrera 10 Okt. 2012 im 21:25