Преобразование 64-битной временной метки в удобочитаемое значение

В моем наборе данных у меня есть два столбца меток времени. Первый - это микросекунды с момента запуска приложения, например, 1400805323. Второй описывается как 64-битная временная метка, которая, я надеюсь, будет указывать время по часам, используя формат NTP количества секунд с 01.01.1901.

Пример «64-битных» временных меток: 129518309081725000 129518309082059000 129518309082393000 129518309082727000 129518309083060000 129518270090833192940000

Есть ли какой-нибудь код Matlab/python, который мог бы преобразовать это в читаемый формат?

Любая помощь высоко ценится,

Стив


person Steve Trawley    schedule 06.06.2011    source источник


Ответы (2)


Если предположить, что эти значения были сгенерированы сегодня, 6 июня 2011 г., эти значения выглядят как количество 100-наносекундных интервалов с 1 января 1601 г. Вот как Windows NT хранит FILETIME. Более подробную информацию о этом читайте в этом блоге. пост Раймонда Чена. В этих статьях также показано, как преобразовать его во что-либо еще.

person Rom    schedule 06.06.2011

См. редактирование ниже для обновленного ответа:
Для времени 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 относится к 1 января 1970 года. Поэтому, если ваша программа основывается на форматах времени ntp с момента запуска программы, вам нужно добавить секунды, чтобы нормализовать метку времени для ctime.

>>> time.ctime(to_seconds(129518309081725000))
'Tue Dec 15 17:37:11 1970'

РЕДАКТИРОВАТЬ: PyGuy прав, исходные временные метки не являются номерами времени ntp, это 64-битные временные метки Windows.

Вот новый метод to_seconds для преобразования интервала 100 нс, основанного на 01.01.1601, в интервал 1970 секунд:

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'
person Dennis    schedule 01.11.2012
comment
этот ответ неверен, строка рассчитывается до даты «2011-06-06 10:48:28.172500+00:00», но ваша формула дает значение, датированное 1970 годом. - person PyGuy; 18.07.2015
comment
Спасибо за подсказку с оригинальным форматом. Я не обращал столько внимания на вывод, сколько на формат времени ntp. - person Dennis; 20.04.2016