2013-08-08 10 views
3

У меня много дат в MatLab (более 2 миллионов). Al эти даты находятся в массиве ячеек в формате 'yyyymmdd', и я хочу преобразовать их в формат 'yyyy-mm-dd' и поместить этот результат в массив ячеек (не в матрице символов).Преобразование формата даты MatLab

Я знаю, что я могу использовать

temp = datestr(datenum(datesArray,'yyyymmdd'),'yyyy-mm-dd'), 

, а затем использовать

mat2cell(temp, ones(1,n),10), 

где n это число строк datesArray (в данном случае около 2 миллионов), чтобы получить мой результат , но этот подход очень медленный.

Итак, я хочу знать, как это сделать.

С уважением.

+0

Я пытаюсь придумать действительно крутое решение! –

+0

Почему у вас все еще есть дата в формате cellstring, а не как серийные даты, вот в чем вопрос !? – Oleg

+0

Поскольку эти даты импортируются из txt-файла внешней системы. – Transfinito

ответ

0

Если ваш формат даты всегда «yyyymmdd», и он находится в линейном массиве ячеек с именем datesArray, вы можете сделать это, обратившись к строкам в datesArray и преобразуя их, вставив дефисы и объединив строку.

for i=1:length(datesArray) 
newDatesArray{i} = [datesArray{i}(1:4), '-', datesArray{i}(5:6), '-', datesArray{i}(7:8)]; 
end 
+0

Я попробую, но, как правило, MatLab не очень эффективен, когда мы используем циклы. Итак, я размышляю в некотором подходе, что aviod петли. – Transfinito

+0

Святой jeebus Я совершил много ошибок. Должно быть исправлено сейчас. Преподает мне не попробовать сначала (о чем я думал?) – thefourtheye

+0

Если вы хотите скорость, я могу просто рекомендовать переключение на более быстрый язык. C, UNIX или даже Python, вероятно, превзойдет MATLAB для огромных массивов. Когда я снова переключаю операционные системы, я мог бы найти достойный ответ UNIX (и проверить его, прежде чем публиковать его: P), но вы также можете попробовать опубликовать другой вопрос с помощью других языковых тегов. – thefourtheye

3

Вы могли бы избежать для петель с помощью cellfun, скажем, ваш массив дата ячейки

dates = {'20120101', '20120102', '20120103'} 

Вы можете преобразовать их в свой формат,

cellfun(@(x)[x(1:4),'-',x(5:6),'-',x(7:8)], dates, 'Uniform', false) 

Надежда, что помогает.

+0

Спасибо за помощь. Эти решения работают нормально и быстро, как ожидалось. – Transfinito

+1

'cellfun()' - скрытый цикл и 99% случая медленнее, чем явный. – Oleg

0

Превратите свои даты в серийный номер и сохраните их! Тем не менее, вот решение:

% Create dummy dates (takes 10 seconds on my pc) 
tic;d = cellstr(datestr(now-2e5+1:now,'yyyymmdd'));toc 

% Convert to char, then concatenate with '-' and back to `cellstr()` (1 sec): 
c = char(d); 
dash = repmat('-',2e5,1); 
c = cellstr([c(:,1:4) dash c(:,5:6) dash c(:,7:8)]); 
+0

Спасибо, но в этом случае начальные даты не находятся в массиве ячеек. – Transfinito

+0

Какой случай? 'd' - массив ячеек строк. – Oleg

0

Итак, вот мое решение, которое я считаю довольно приятным!

dates = {'20120101', '20120102', '20120103'} 

И вы можете конвертировать с помощью этого:

cellfun(@(x)regexprep(num2str(x), '(?<=\d{4})\d{2}', '-$0'),dates,'Uniform',false) 

Ответ похож на radarhead, но он использует функцию regexprep вместо этого.

+0

Спасибо за помощь. На самом деле, я пробую regexprep (date, '(? <= \ D {4}) \ d {2}', '- $ 0') а также работает отлично :) – Transfinito

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