2014-10-28 7 views
2

У меня есть время как string формат в моих данных. Может ли кто-нибудь помочь мне преобразовать эту дату в миллисекунды в Matlab.Преобразование времени в миллисекунды?

Это пример того, как выглядит дата '00:26:16:926'. Таким образом, это 0 часов 26 минут 16 секунд и 926 миллисекунд. После преобразования этого времени мне нужно получить только миллисекунды, такие как 1576926 миллисекунд за время, которое я дал выше. Заранее спасибо.

ответ

5

Почему бы вам не попробовать вместо этого использовать datevec? datevec предназначен для использования в различных строках времени и даты, и он анализирует строку и выдает полезную информацию для вас. Нет необходимости использовать regexp или разделите свою строку любым способом. Вот простой пример:

[~,~,~,hours,minutes,seconds] = datevec('00:26:16:926', 'HH:MM:SS:FFF'); 
out = 1000*(3600*hours + 60*minutes + seconds); 

out = 

1576926 

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


Прелесть с datevec, что он может принимать Множественные строк так что вы не ограничены только одним входом. Проще говоря все ваши строки в массив одной ячейки, а затем использовать datevec следующим образом:

times = {'00:26:16:926','00:27:16:926', '00:28:16:926'}; 
[~,~,~,hours,minutes,seconds] = datevec(times, 'HH:MM:SS:FFF'); 
out = 1000*(3600*hours + 60*minutes + seconds); 

out = 

    1576926 
    1636926 
    1696926 
+0

Это менее гибко, чем строки, такие как '0:26: 19: 926' не принимаются. И это не проще :) Однако +1 для 'datevec' - приятная функция! – matheburg

+0

@matheburg - я полагаю, нет, но если каждая строка следует за одним и тем же форматом, то я не понимаю, почему мы не можем ее использовать :) Спасибо за поддержку BTW! – rayryeng

+0

Наши ответы все очень похожи, поэтому я отчаянно ищу преимущества в моем; P – matheburg

1

Если предположить, что ваша строка даты приходит в таком формате последовательно, вы могли бы использовать что-то же просто, как это:

test = '00:26:16:926'; 
H = str2num(test(1:2)); % hours 
M = str2num(test(4:5)); % minutes 
S = str2num(test(7:8)); % seconds 
MS = str2num(test(10:12)); % milliseconds 
totalMS = MS + 1000*S + 1000*60*M + 1000*60*60*H; 

Выход:

1576926.00 
+0

Итак, мне нужно использовать для цикла, чтобы применить эту строковую дату в моих данных? – Ram

+0

Если вы хотите сделать этот процесс несколько раз, вы можете использовать цикл. Но предпочтительно определите функцию, которая берет вашу временную строку как входную и итоговую мс в качестве вывода, а затем использует 'cellfun' в вашем массиве ячеек строк. –

5

Одним из решений может быть:

timeString = '00:26:16:926'; 
cellfun(@(x)str2num(x),regexp(timeString,':','split'))*[3600000;60000;1000;1] 

Результат:

1576926 
+1

Замечание: 'regexp (timeString, ':', 'split')' можно заменить в текущих версиях Matlab на 'strsplit (timeString, ':')' – matheburg

+0

Как я могу применить это к моим данным? Когда я попытался применить, я получил некоторую ошибку (ошибка с использованием str2num (строка 33)). Вот что я сделал «timeString = data.ESUTimestamp; cellfun (@ (x) str2num (x), regexp (timeString, ':', 'split')) * [3600000; 60000; 1000; 1] ' ESUTimestamp - это столбец в моих данных, и все его элементы это тот же формат, что и в моем примере. – Ram

+0

Вы уверены, что 'data.ESUTimestamp' - чистая строка? Или это массив ячеек?В этом случае вы можете попробовать что-то вроде: 'yourCellData = data.ESUTimestamp; cellfun (@ (timeString) cellfun (@ (x) str2num (x), regexp (timeString, ':', 'split')) * [3600000; 60000; 1000; 1], yourCellData) '... просто догадка – matheburg

0

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

a = ['00:26:16:926' ; '08:42:12:936'] 
datevec(a,'HH:MM:SS:FFF') * [0 0 0 3600e3 60e3 1e3]' 

ans = 

    1576926 
    31332936 
+0

Не видите, как это ничем не отличается от моего ответа, кроме умного вычисления суммы с помощью точки продукт ... не говоря уже о том, что вы ответили на этот вопрос почти через 5 месяцев после его решения (мной). – rayryeng

Смежные вопросы