Преобразование десятичных знаков в [ч]: мм: сс - PullRequest
0 голосов
/ 17 октября 2018

Я импортирую данные из Excel в MATLAB.Мои данные в Excel имеют формат [h]:mm:ss, но после импорта в MATLAB данные становятся десятичным числом.

Есть ли способ преобразовать эти данные обратно в формат [h]:mm:ss в MATLAB?

Некоторые примеры:

21:45:05 equals 0.906307870370370
21:14:31 equals 0.885081018518519
213:17:56 equals 8.88745370370370

Я понимаю, что преобразование кратно24 часа, будь то в секундах, минутах или часах - что означает 12:00:00 = 0,5.Но я не понимаю, как я мог преобразовать данные обратно, то есть 0,75 становится 18:00:00 и т. Д.

Я пытался New_Nun(i,j) = datestr(nun(i,j),'HH:MM:SS'); сделать это преобразование, но я получаю эту ошибку -

Невозможно выполнить назначение, потому что индексы с левой стороны не совместимы с размером с правой стороны.

Это может быть из-за того, что моя переменная nun имеет NaN в?

1 Ответ

0 голосов
/ 17 октября 2018

Обратите внимание, что datestr выводит строку, в то время как назначение New_Nun(i,j)=... ожидает одно значение.

datestr(nun(i,j),'HH:MM:SS') выводит массив [8 x 1] char, который не помещается в New_Nun(i,j),И, кстати, 'HH:MM:SS' действительно правильный аргумент для часов, минут и секунд.

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

%Initialize random values with a NaN
nun=rand([5 5]);
nun(2,5)=NaN;

New_Nun = cell(size(nun));  %Initialize the cell array
not_a_nan = ~isnan(nun);    %Selection valid values
New_Nun(not_a_nan) = cellstr(datestr(nun(not_a_nan),'HH:MM:SS')); %Fill the cell array

disp(New_Nun)    
'13:47:28'    '23:37:19'    '06:00:28'    '13:24:09'    '12:38:05'
'00:55:58'    '08:34:58'    '04:25:44'    '11:14:46'            []
'13:17:25'    '10:34:02'    '11:17:16'    '04:42:18'    '05:51:32'
'20:40:44'    '18:30:16'    '04:29:22'    '17:43:03'    '22:05:24'
'16:36:35'    '10:17:18'    '22:45:41'    '16:04:17'    '07:06:39'

Значение NaN было преобразовано в пустую ячейку.Его можно заменить любым значением по умолчанию, например, New_Nun(~not_a_nan)={'00:00:00'};

Этот код не обрабатывает часы свыше 24, как datestr.Для этого часы нужно обрабатывать отдельно.

%Initialize random values with a NaN and one value larger than 24h
nun=rand([5 5]);
nun(2,5)=NaN;
nun(3,4)=nun(3,4)+10;   % One value above 24h

New_Nun = cell(size(nun));  %Initialize the cell array
not_a_nan = ~isnan(nun);    %Selection valid values

mmss = cellstr(datestr(nun(not_a_nan),'MM:SS')); %Write only MM:SS
hh   = floor(nun(not_a_nan(:))*24); %Get hours, and make it a column vector

%Now, add the hours
hours_not_zero = hh~=0; % Optional: used to display mm:ss if hh=0
mmss(hours_not_zero) = cellfun(@(h,m) sprintf('%02d:%s',h,m),num2cell(hh(hours_not_zero)),mmss(hours_not_zero),'uniformoutput',false);


New_Nun(not_a_nan) = mmss;
disp(New_Nun)
'02:53:42'    '08:38:56'    '12:07:03'    '15:28:54'    '12:49:18'
'16:21:15'    '03:44:23'    '01:22:31'    '20:43'               []
'02:36:04'    '11:08:51'    '19:51:35'    '244:45:48'   '33:55'   
'16:14:08'    '08:04:01'    '12:27:22'    '08:17:48'    '06:16:15'
'10:41:08'    '03:16:19'    '04:47:15'    '04:33:37'    '20:36:42'

На этот раз значение 35:34:11 отображается правильно.Значимые часы не отображаются, например, «20: 43» для «00: 20: 43».

...