Generating array of consecutive timestamps in double
2 ビュー (過去 30 日間)
古いコメントを表示
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 件のコメント
Oleg Komarov
2012 年 9 月 11 日
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.
採用された回答
Oleg Komarov
2012 年 9 月 11 日
編集済み: Oleg Komarov
2012 年 9 月 11 日
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);
その他の回答 (1 件)
Amarjit Dhillon
2017 年 8 月 31 日
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 件のコメント
Peter Perkins
2017 年 8 月 31 日
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 ...
参考
カテゴリ
Help Center および File Exchange で Time Series Objects についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!