unixtime ticks long hexadecimal from fecha convertir convert python datetime gps hex

python - ticks - timestamp to date



Python: tiempo hexadecimal hasta la fecha (2)

23 DD 78 34 = 2013-01-28 21:52:XX //second not sure 92 e3 78 34 = 2013-01-28 22:14:XX d4 e3 78 34 = 2013-01-28 22:15:XX 16 e4 78 34 = 2013-01-28 22:16:XX

cómo convertir el hexadecimal a la hora de la fecha? no es UNIX Date


El valor hexadecimal parece que está codificado en little endian, pero no tiene sentido usar segundos como valores de tick:

>>> values = [ ... (0x3478dd23, datetime(2013, 1, 28, 21, 52)), ... (0x3478e392, datetime(2013, 1, 28, 22, 14)), ... (0x3478e3d4, datetime(2013, 1, 28, 22, 15)), ... (0x3478e416, datetime(2013, 1, 28, 22, 16)) ... ] ... >>> for s, dt in values: ... print dt - datetime.fromtimestamp(s) ... 5544 days, 19:02:37 5544 days, 18:57:10 5544 days, 18:57:04 5544 days, 18:56:58

Como la compensación se está reduciendo con el tiempo, calculé un factor de corrección:

>>> ts_delta = values[1][0] - values[0][0] >>> ts_delta 1647 >>> dt_delta = values[1][1] - values[0][1] >>> dt_delta datetime.timedelta(0, 1320) >>> dt_delta = dt_delta.days * 60*60*24 + dt_delta.seconds >>> dt_delta 1320 >>> factor = float(dt_delta) / float(ts_delta) >>> factor 0.8014571948998178

1647 tics = 1320 segundos.

Ahora, si aplicamos este factor a las marcas de tiempo, el desplazamiento se mantiene bastante constante (excepto los segundos, pero como no se conoce su valor, acabo de utilizar 0 en los datos de origen)

>>> for s, dt in values: ... print dt - datetime.fromtimestamp(s * factor) ... 7567 days, 17:16:08.233151 7567 days, 17:16:08.233151 7567 days, 17:16:15.336976 7567 days, 17:16:22.440802

Teniendo esto en cuenta, puede usar este desplazamiento y factor para convertir los valores originales:

>>> offset = values[0][1] - datetime.fromtimestamp(values[0][0]*factor) >>> offset datetime.timedelta(7567, 62168, 233151) def hex_to_datetime(s): return datetime.fromtimestamp(s*factor) + offset >>> for s, dt in values: ... print hex_to_datetime(s), dt ... 2013-01-28 21:52:00 2013-01-28 21:52:00 2013-01-28 22:14:00 2013-01-28 22:14:00 2013-01-28 22:14:52.896175 2013-01-28 22:15:00 2013-01-28 22:15:45.792349 2013-01-28 22:16:00

Esto me parece bastante prometedor.


Entonces, los enteros hexadecimales son obviamente little-endian. Para convertir a enteros:

880336163 > 2013-01-28 21:52:XX 880337810 > 2013-01-28 22:14:XX 880337876 > 2013-01-28 22:15:XX 880337942 > 2013-01-28 22:16:XX

Y teniendo en cuenta el delta entre los últimos tres, el valor está en segundos.

Usando la fecha provista y trabajando los números correspondientes de segundos, obtienes las siguientes fechas de época:

1985-03-07 20:02:37 1985-03-07 19:57:10 1985-03-07 19:57:04 1985-03-07 19:56:58

Incluso teniendo en cuenta los errores de sesgo y muestreo del tiempo, la época parece extraña. La época del GPS es el 6 de enero de 1980, creo ... Necesitará más muestras para determinar una época exacta.

De todos modos, aquí está el guión que utilicé para derivar las épocas:

import datetime as dt data = [ (''23 DD 78 34'',(2013,01,28,21,52)), (''92 e3 78 34'',(2013,01,28,22,14)), (''d4 e3 78 34'',(2013,01,28,22,15)), (''16 e4 78 34'',(2013,01,28,22,16)), ] def hex_to_int(string): string = ''''.join(reversed(string.split())) return int(string,16) for (string,date) in data: secs = hex_to_int(string) date = dt.datetime(*date) delta = dt.timedelta(seconds=secs) print date - delta

Una vez que tenga la época, convierta la cadena hexadecimal a un entero como el anterior y agréguela a la época para obtener el tiempo de fecha correspondiente:

import datetime as dt epoch = dt.datetime(YYYY,MM,DD,HH,MM,SS) def hex_to_datetime(string): delta = dt.timedelta(seconds=hex_to_int(string)) return epoch + delta

Espero que esto ayude.