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.