在我的数据集中,我有两个时间戳列。第一个是自应用程序启动以来的微秒 - 例如,1400805323.第二个被描述为64位时间戳,我希望它将指示时钟时间,使用从1/1/1901开始的NTP格式。
'64位'时间戳示例: 129518309081725000 129518309082059000 129518309082393000 129518309082727000 129518309083060000 129518309083394000 129518309083727000
是否有任何matlab / python代码可以将其转换为可读格式?
任何帮助非常感谢,
史蒂夫
答案 0 :(得分:5)
假设这些值是在今天(2011年6月6日)生成的,这些值看起来就像1601年1月1日以来的100纳秒间隔的数量。这就是Windows NT存储FILETIME的方式。有关this的更多信息,请阅读Raymond Chen的博客文章。这些文章还介绍了如何将其转换为其他任何内容
答案 1 :(得分:5)
请参阅下面的编辑以获取更新的答案:
对于NTP时间,64位被分成秒和几分之一秒。前32位是秒。底部32位是秒的分数。通过将分数部分除以2 ^ 32得到分数。
所以第一步,转换为双倍。
如果你觉得python很容易,我没有添加任何边界检查:
def to_seconds(h):
return (h>>32) + ((float)(h&0xffffffff))/pow(2,32)
>>> to_seconds(129518309081725000)
30155831.26845886
时间模块可以将浮动转换为可读的时间格式。
import time
time.ctime(to_seconds(ntp_timestamp))
您需要担心时间戳的来源。 time.ctime假定与1970年1月1日相关。因此,如果您的程序基于程序运行后的ntp格式,那么您需要添加秒来规范化ctime的时间戳。
>>> time.ctime(to_seconds(129518309081725000))
'Tue Dec 15 17:37:11 1970'
编辑: PyGuy是对的,原始时间戳不是ntp时间数,它们是Windows 64位时间戳。
以下是将基于1/1/1601的100ns间隔转换为1970秒间隔的新to_seconds方法:
def to_seconds(h):
s=float(h)/1e7 # convert to seconds
return s-11644473600 # number of seconds from 1601 to 1970
新输出:
import time
time.ctime(to_seconds(129518309081725000))
'Mon Jun 6 04:48:28 2011'