有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
答案 0 :(得分:4)
在内部,datenum
会进行大量的摆弄以处理许多不同的日期格式。然后它根据日期格式和您调用datenummx
的语法调用具有不同输入参数的内部函数datenum
。
如果您事先知道将使用哪种语法datenum
,以及您将使用哪种日期格式,则可以直接致电datenummx
。由于datenummx
是一个内置的MEX文件,并且避免了所有开销处理,因此通常
查看datenum
(edit 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');