Matlab:将日期字符串转换为datenum会变慢吗?

时间:2013-02-20 14:10:06

标签: matlab

有100,000个日期字符串转换为datenums,Matlab真的很慢...... 20秒!!有没有更快的方法呢?

%strDay  
%strTime

dblDate = zeros(1, nLines);
for i = 1 : nLines
    dblDate(j) = datenum([strDay{i}, ' ', strTime{i}], 'yy.mm.dd HH:MM:SS.FFF');
    j = j + 1;
end

4 个答案:

答案 0 :(得分:4)

在内部,datenum会进行大量的摆弄以处理许多不同的日期格式。然后它根据日期格式和您调用datenummx的语法调用具有不同输入参数的内部函数datenum

如果您事先知道将使用哪种语法datenum,以及您将使用哪种日期格式,则可以直接致电datenummx。由于datenummx是一个内置的MEX文件,并且避免了所有开销处理,因此通常

更快。

查看datenumedit datenum类型),找出为您的应用调用datenummx的合适方式。

(另外,执行其他答案建议的所有矢量化)。

答案 1 :(得分:2)

您可以尝试避免循环:

tmp = repmat({' '}, length(strDay), 1);
datenum(cell2mat([strDay  (:), tmp(:),  strTime(:)]))

<强>〜编辑〜
到目前为止,对所有解决方案进行了一些基准测试:

% creating some bogus data
a = ones(10000,1).*(now.*rand(10000,1));
str = datestr(a,'yy.mm.dd HH:MM:SS.FFF');
strDay = cellstr(str(:,1:8));
strTime = cellstr(str(:,10:end));

%% jdl's original code
disp('jdl''s original code')
tic
nLines = length(strDay);
dblDate = zeros(1, nLines);
j = 1;
for i = 1 : nLines
    dblDate(j) = datenum([strDay{i}, ' ', strTime{i}]);
    j = j + 1;
end
toc

%% hmuster's solution
disp('hmuster''s solution')
tic
tmp = repmat({' '}, length(strDay), 1);% cell(size(str1));
b = datenum(cell2mat([strDay(:), tmp(:),  strTime(:)]));
toc

%% ThijsW's solution
disp('ThijsW''s solution')
tic
strDay = cell2mat(strDay);
strTime = cell2mat(strTime);

dblDate = datenum([strDay, (' ')*ones(size(strTime)), strTime], 'yy.mm.dd HH:MM:SS.FFF');
toc

% jdl's solution
disp('jdl''s solution')
tic
dblDate = datenum(strDay, 'yy.mm.dd') + ...
    datenum(strTime, 'HH:MM:SS.FFF') - ...
    datenum('00:00:00.000', 'HH:MM:SS.FFF');
toc

这导致:

jdl's original code
   Elapsed time is 19.624597 seconds.
hmuster's solution
   Elapsed time is 4.029291 seconds.
ThijsW's solution
   Elapsed time is 0.183376 seconds.
jdl's solution
   Elapsed time is 0.222996 seconds.

答案 2 :(得分:2)

没有for循环尝试它。 datenum应该能够处理向量。

strDay = cell2mat(strDay);
strTime = cell2mat(strTime);

dblDate = datenum([strDay, (' ')*ones(size(strTime)), strTime], 'yy.mm.dd HH:MM:SS.FFF');

答案 3 :(得分:2)

我发现这是将时间从20秒减少到2秒:

dblDate = datenum(strDay, 'yy.mm.dd') + ...
          datenum(strTime, 'HH:MM:SS.FFF') - ...
          datenum('00:00:00.000', 'HH:MM:SS.FFF');