将GPS历元的二进制64位时间戳偏移量转换为python datetime对象

将GPS历元的二进制64位时间戳偏移量转换为python datetime对象,python,datetime,binary,Python,Datetime,Binary,我正试图找出我认为应该是8字节/64位的时间戳 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\x

我正试图找出我认为应该是8字节/64位的时间戳

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
我认为由
t1
t2
产生的值应与GPS_历元偏移。 但是,我似乎无法获得与预期结果datetime匹配的结果

我一直在阅读,它似乎合乎逻辑,这将被分成两部分,一部分可能是分数,另一部分是秒(每个4字节?)。然而,我还没有找到任何基于GPS历元的时间戳格式的参考


你知道如何将其转化为预期结果吗?

编辑

很抱歉,这不是一个解决方案,如果其他人有更多时间深入了解,则只提供一些起点

存储的第一个日期的“隐藏”编号应为:

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   <----
用更少的数据进行测试

>>> 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)
请发布更多数据样本和预期结果,以检查或推断新公式


我采用了@leon_matthews:+1;)的解包方法


我希望有人能找到解决办法。我会听你的回答

您可以使用标准库的模块查看您的八个字节是否编码64位整数:

这是一个相当大的整数!但这与你列出的时代有关吗?可能不是


也许不是整数。我有一个原始的GPS模块,我一直在玩,它的数据在NMEA语句中以串行形式显示。你可以在网上找到。

我有。你提供了足够的例子

>>> 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)
>>t1=“\x00\x00\xBF\x13\xDB\x79\xC0\x00”#预计时间:2012-10-04 01:00:51.759
>>>导入结构
>>>导入日期时间
>>>GPS_EPOCH=datetime.datetime(1980,1,6)

>>>t1_unpack=struct.unpack('请发布一个不同字符串和期望值的列表,以查找某些模式。您的第三个示例不正确。我们需要相隔一天以上的示例。谢谢,我添加了另一个示例。我目前没有其他日期的示例时间。我在编辑的答案中使用了您+1的解包方法。如果这是f的问题,请或者你我可以删除我的答案。另外,我是第一个看到你的个人资料的人;)谢谢你的努力!你似乎从“预期”日期时间中得到了已知的毫秒数,然后加上和减去未打包的值。不幸的是,这还没有帮助,因为它只会导致添加“预期”值datetime到gps纪元的偏移量。@monkut,我从你提供的信息中推断出了这一点。我的谷歌技能没有发现任何东西。哇!干得好+1。这是一种高水平的回答,上投票率很低,很遗憾。其他人写了一个简单的SQL语句,得到了6票。祝贺你,你就是那个人!
>>> 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)
>>> import struct
>>> number = struct.unpack('q', "\x00\x00\xBF\x13\xDB\x79\xC0\x00")
>>> "{:,}".format(number)
'54,177,177,364,529,152'
>>> 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)
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)