Faster function than date in MATLAB

Does anyone know a faster way to convert a date string (2010-12-12 12: 21: 12.123) to a number?

+5
source share
4 answers

It is often useful to profile Matlab's built-in functions and retrieve only the internal functionality of interest.

In your particular case

dtstr2dtnummx({'2010-12-12 12:21:12.123'},'yyyy-MM-dd HH:mm:ss')

3 times faster (takes 30% of the time) than:

datenum({'2010-12-12 12:21:12.123'},'yyyy-mm-dd HH:MM:SS')

where dtstr2dtnummx is an internal function (C: \ Program Files \ Matlab \ R2011a \ toolbox \ matlab \ timefun \ private \ dtstr2dtnummx.mexw32 on my Windows machine).

, Matlab addpath dtstr2dtnummx.mexw32 , Matlab.

, dtstr2dtnummx datenum, !

, , , !

5/5/2011: , http://undocumentedmatlab.com/blog/datenum-performance/

+18

. , . , (Postgres, Sql- Oracle - , ), Matlab , Matlab. , !

+2

, , , many. JIT Matlab , ,

datenum(cellarrayofdates, 'yyyy-mm-dd HH:MM:SS');

for i=1:length(cellarrayofdates); datenum(cellarrayofdates{i}, 'yyyy-mm-dd HH:MM:SS'); end

, , .

+2

, . , 30-40 , . . . - , , .

1 792 379 :

  • datenum - 11.463186
  • datenumjck - 0.300503

textscan .

:

, :

Data,2016-03-03,16:15:50;686,0.000000,-0.009500
Data,2016-03-03,16:15:50;696,0.000000,0.006500
Data,2016-03-03,16:15:50;706,0.000000,0.004500
Data,2016-03-03,16:15:50;716,0.000000,-0.006000

:

fileID = fopen('myFile.csv','r');
formatSpec = '%*s %f %f %f %f %f %f %f %*[^\n]'; % Ignore first string, save
                                                 % date and time as doubles
                                                 % ignore all other data
data = textscan(fileID,formatSpec,'delimiter',',\t/:;-.\\ ');
fclose(fileID);

datenumjck():

dateFormat = 'yyyy-mm-dd,HH:MM:SS;FFF';
numDate = datenumjck(data,dateFormat);

:

function num = datenumjck(data, dateFormat)

n = size(data{1});
dateFormat = textscan(dateFormat,'%s','delimiter',',/:;-.\\');
dateFormat = dateFormat{1};

k = find(strcmp('yyyy', dateFormat),1);
if ~isempty(k)
    y = data{k};
elseif ~isempty(find(strcmp('yy', dateFormat),1))
    y = data{find(strcmp('yy', dateFormat),1)};
else
    y = zeros(n);
end

k = find(strcmp('mm', dateFormat),1);
if ~isempty(k)
    m = data{k};
elseif ~isempty(find(strcmp('mmm', dateFormat),1))
    month = cellfun(@strfind,...
        repmat({'janfebmaraprmayjunjulaugsepoctnovdec'},...
        size(data),lower(data(find(strcmp('mmm', dateFormat),1)))));
    m = (month+2)/3;
else
    m = zeros(n);
end

k = find(strcmp('dd', dateFormat),1);
if ~isempty(k)
    d = data{k};
else
    d = zeros(n);
end

k = find(strcmp('HH', dateFormat),1);
if ~isempty(k)
    H = data{k};
else
    H = zeros(n);
end

k = find(strcmp('MM', dateFormat),1);
if ~isempty(k)
    M = data{k};
else
    M = zeros(n);
end


k = find(strcmp('SS', dateFormat),1);
if ~isempty(k)
    S = data{k};
else
    S = zeros(n);
end

k = find(strcmp('FFF', dateFormat),1);
if ~isempty(k)
    F = data{k};
else
    F = zeros(n);
end

ms = [0,31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];

num = zeros(n);
for k = 1:n
    num(k) = y(k)*365 + ms(m(k)) + d(k) + floor(y(k)/4)...
        - floor(y(k)/100) + floor(y(k)/400) + (mod(y(k),4)~=0)...
        - (mod(y(k),100)~=0) + (mod(y(k),400)~=0)...
        + (H(k)*3600 + M(k)*60 + S(k) + F(k)/1000)/86400 + 1;
end
0

All Articles