Generating array of consecutive timestamps in double
2 views (last 30 days)
Show older comments
I need to generate an array of consecutive timestamps, in double and yyyymmddHHMMSS format, for specified start and end times. For example:
timestamps(1) = 2.012082104000000e+013;
timestamps(2) = 2.012082104000100e+013;
...
...
timestamps(120) = 2.012082104020000e+013;
I wrote a working piece of code, but the str2double/datestr combination in the parfor loop is too slow (I used 120 seconds as an example, but in actual use, I will be generating about 10^7 consecutive seconds of timestamps). Is there a faster way to do this?
if matlabpool('size') == 0
matlabpool local
end
startDate = num2str(2.012082104000000e+013);
endDate = num2str(2.012082104020000e+013);
startDateyyyy = str2double(startDate(:,1:4));
startDatemm = str2double(startDate(:,5:6));
startDatedd = str2double(startDate(:,7:8));
startDateHH = str2double(startDate(:,9:10));
startDateMM = str2double(startDate(:,11:12));
startDateSS = str2double(startDate(:,13:14));
startDateVec = [startDateyyyy startDatemm startDatedd startDateHH ...
startDateMM startDateSS];
startDate = datenum(startDateVec);
endDateyyyy = str2double(endDate(:,1:4));
endDatemm = str2double(endDate(:,5:6));
endDatedd = str2double(endDate(:,7:8));
endDateHH = str2double(endDate(:,9:10));
endDateMM = str2double(endDate(:,11:12));
endDateSS = str2double(endDate(:,13:14));
endDateVec = [endDateyyyy endDatemm endDatedd endDateHH ...
endDateMM endDateSS];
endDate = datenum(endDateVec);
timestamps = startDate:(1/24*1/60*1/60):endDate;
parfor i = 1:length(timestamps)
timestamps(i) = str2double(...
datestr(timestamps(i),'yyyymmddHHMMSS'));
end
Thanks in advance!
3 Comments
Oleg Komarov
on 11 Sep 2012
As you can see from my answer, the appearance of dates can be controlled with datestr() and I still recommend to store dates as MATLAB serial numbers produced with datenum(). I am posting an alternative solution to let you see how bothersome is to store dates in a different way.
Accepted Answer
Oleg Komarov
on 11 Sep 2012
Edited: Oleg Komarov
on 11 Sep 2012
I recommend to use MATLAB serial dates as produced by datenum(). Any manipulation with dates becomes much easier. The appearance can be controlled with datestr().
% Generate serial dates increasing by one second from 2012-08-21 04:00:00
dates = datenum(2012,08,21,4,0,0:120)
% Visualize them in format 31 yyyy-mm-dd HH:MM:SS
datestr(dates,31)
Alternatively:
st = 20120821040000;
en = 20120821040200;
sten = [st; en];
y = floor(sten/1e10);
m = floor(rem(sten, 1e10)/1e8);
d = floor(rem(sten, 1e8)/1e6);
HH = floor(rem(sten, 1e6)/1e4);
MM = floor(rem(sten, 1e4)/1e2);
SS = rem(sten, 1e2);
% Again MATLAB serial dates
stenser = datenum(y,m,d,HH,MM,SS);
dates2 = stenser(1):1/(60^2*24):stenser(2);
% Controlling appearance
datestr(dates2,31);
% Now you have to reverse into yyyymmddHHMMSS
dtvc = datevec(dates2);
out = dtvc(:,1)*1e10 + dtvc(:,2)*1e8 + dtvc(:,3)*1e6 +...
dtvc(:,4)*1e4 + dtvc(:,5)*1e2 + dtvc(:,6);
More Answers (1)
Amarjit Dhillon
on 31 Aug 2017
Let's say we want to generate timestamps in the format of yyyymmddHHMMSS for 10 days
1-Jan-2017 at 12:00:00 to 10-Jan-2017 till 12:00:00, This can be easily generated by below-written code
t1 = datetime(2017,1,1,12,0,0);
t2 = datetime(2017,1,10,12,0,0);
data = t1:seconds(1):t2;
datestr(data,'yyyymmddHHMMSS')
1 Comment
Peter Perkins
on 31 Aug 2017
Amarjit, your suggestion to use datetime is a good one (the OP was from 1012, before datetime existed in MATLAB). But actually, there's usually no reason to convert it to text. Just change the format:
>> data.Format = 'yyyymmddHHMMSS'
data =
1×3 datetime array
20170001120100 20170001120100 20170001120100 ...
See Also
Categories
Find more on Time Series Objects in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!