Как использовать типы дат DateTime или FileTime в Matlab - PullRequest
0 голосов
/ 01 ноября 2010

Я хотел бы проанализировать / преобразовать тип данных DateTime (или FileTime), который является int64 и измерен в «тиках», которые составляют единицы по 100 наносекунд, в datenum или лучший формат даты и времени в Matlab.

Я должен использовать счетчик с высоким разрешением 64 бита, так как разница между метками времени может составлять пару микросекунд, а «интервал» даже не равен.

Используя последнюю версию Matlab, переменная "ticks" читается как строка.

Любые рекомендации?

Спасибо за вашу помощь

Ответы [ 3 ]

2 голосов
/ 01 ноября 2010

Datenums, вероятно, не будут представлять это эффективно. Они двойные, приблизительного типа, с 1,0 = 1 день; предел разрешения для последних дат составляет около 10 микросекунд. Кроме того, функции, относящиеся к datenum, не написаны для высокоточной обработки и, вероятно, не будут хорошо работать здесь.

>> datenum_precision = eps(now)
datenum_precision =
  1.1642e-010
>> millisecond = 1.0/(24*60*60*1000)
millisecond =
  1.1574e-008
>> 

Возможно, вам лучше создать свой собственный класс, который заключает в себе «галочки» как uint64 и предоставляет методы для преобразования в удобочитаемую презентацию (например, datestr ()), выполнения сложения и вычитания, парсинга полученных строк. до значений uint64 и т. д. Что-то с таким интерфейсом.

classdef filetime
    properties
        tick; % An array of uint64 ticks
    end
    methods (Static = true)
        out = parse(str); % Parse strings to @filetime
    end
    methods
        out = filetimestr(obj); % human-readable strings
        out = minus(a,b);
        out = plus(a,b);
        out = sort(obj);
        out = datenum(obj); % maybe a lossy conversion to datenum, for convenience
    end
end

Вам понадобится R2010b для выполнения арифметики на 64-битных целых числах; старые версии не поддерживают его.

Сложнее было бы, если бы вы хотели создавать графики с использованием объектов filetimetick; графики Handle Graphics не поддерживают пользовательские объекты.

0 голосов
/ 25 августа 2017

D - это значение uint64, равное 100 нс с 01-01-1601, результат должен быть datenum.Это означает, что прошло дней с 00-Jan-0000.

step = 100E-9; % 100 nanoseconds
step = step/(24*60*60); %fraction of a day
D = datenum('01-01-1601')+double(D)*step;
%D is now a datenum

Современная версия с использованием datetime (matlab> 2014b)

%uint64 value of 100 ns since 01-01-1601
step = 100E-9; % 100 nanoseconds
step = step/(24*60*60); %fraction of a day
D = datetime('01-01-1601')+days(double(D)*step);

Как упоминалось выше, оба метода теряют некоторую точность, которую мы имели,В случае datetime это, вероятно, можно обойти.Это происходит в double(D)*step, потому что D велико для текущих дат.С 1601 года прошло много наносекунд. Преобразовав D в более новое смещение, можно получить более точное преобразование.

0 голосов
/ 01 ноября 2010

Вы можете преобразовать свои числа в серийную дату MATLAB с помощью простого уравнения:

step = 1e-7; % 100 nanosec
ticks = int64(250000);
timenum = double(ticks)*step/24/60/60;

Во-первых, для очень больших целочисленных значений преобразование в двойное может потерять точность.Если это так, то вам, вероятно, лучше остаться со своими номерами без преобразования в серийную дату.

Во-вторых, функции DATESTR / DATETICK поддерживают точность до миллисекунд.Попробуйте:

datestr(timenum,'HH:MM:SS.FFF')

Итак, подумайте об этом и, пожалуйста, ответьте на комментарий Эндрю - для чего вам нужно это преобразование?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...