2016-04-08 6 views
0

Ich habe die Start- und EndzeitWie kann ich 5-Minuten-Zeitschrittdateinamen in Matlab erstellen?

startTime = 12-Jun-2011 00:00:00 
endTime = 13-Jun-2011 1:45:00 

Und ich möchte Dateinamen in einem Array zu speichern, alle fünf Minuten dieser Art erstellen:

RATE.20110612.000000.tif 
RATE.20110612.000500.tif 
RATE.20110612.001000.tif 
RATE.20110612.001500.tif 
. 
. 
. 
RATE.20110613.014000.tif 
RATE.20110613.014500.tif 

Bisher habe ich dies tue:

endTime = datenum('13-Jun-2011 1:45:00'); 
startTime = datenum('12-Jun-2011 00:00:00'); 
minSteps =int8(((endTime-startTime)*24*60)/5) %Number of 5 minute steps between start and end time 

for k = 1:minSteps 
    FileNames{k} = strcat('RATE.',datestr(startTime, 'yyyymmdd.hhMMss'), '.tif'); 
    startTime = addtodate(startTime, 5, 'minute'); 
end 

Aber das funktioniert nicht. Wie kann ich es tun? Die Anzahl der Schritte ist ebenfalls falsch.

+0

In Ihrem letzten Stück Code scheinen 'startTime' und' endTime' gewechselt zu haben. Ist das der Grund, warum es nicht funktioniert? – mikkola

+0

Der [maximale Wert eines 'int8' ist 127] (http://www.mathworks.com/help/matlab/ref/int8.html?refresh=true). Ihre berechnete Anzahl von Intervallen ist 309. – excaza

+0

Diese int8 Werte sind ein Schmerz, mit dem zu arbeiten ist. Ich arbeite hauptsächlich in R und habe diese Probleme nicht vor ... Bitte schlagen Sie vor, wie ich es beheben kann ... – maximusdooku

Antwort

2

Aus der Dokumentation für int8:

Die Werte reichen von -2 -2 - 1.

Dieser Maximalwert von 127 gibt.

Von Ihrem Beispiel Ihr Maximalwert ist 309:

startTime = datenum('12-Jun-2011 00:00:00'); 
endTime = datenum('13-Jun-2011 1:45:00'); 
minSteps = ((endTime-startTime)*24*60)/5 

minSteps = 

    309.0000 

So minSteps zu int8 neu zu fassen versucht wird den Maximalwert zurück, 127.

Entweder neu gefasst auf eine ganze Zahl Klasse mit einem höheren Limit (int16, int32, int64, uint16, uint32, uint64) oder nicht der Mühe, überhaupt auf eine ganze Zahl Neufassung und nur rund minSteps (floor, ceil, round). Wenn Sie keine als Integer haben müssen, ist es wirklich sinnlos, sie neu zu schreiben. Das wird die Werte von k in Ihrer Schleife nicht beeinflussen.

2

Warum vermeiden Sie nicht die for Schleife und die Berechnungen mit duration Objekte und erstellen Sie einen Vektor von datetime (s)?

startTime = datetime('12-Jun-2011 00:00:00'); 
endTime = datetime('13-Jun-2011 1:45:00'); 
dt = duration(0,5,0); % 5 min interval 

% Get vector of datetime values in the interval 
timeVec = startTime:dt:endTime; 

% print datetime values in required format 
fileIds = cellstr(datestr(timeVec,'yyyymmdd.HHMMSS')); 
fileNames = strcat(repmat({'RATE.'},numel(fileIds),1),fileIds,repmat({'.tif'},numel(fileIds),1)); 

>> fileNames 

fileNames = 

'RATE.20110612.000000.tif' 
'RATE.20110612.000500.tif' 
'RATE.20110612.001000.tif' 
'RATE.20110612.001500.tif' 
.... 
'RATE.20110613.013500.tif' 
'RATE.20110613.014000.tif' 
'RATE.20110613.014500.tif' 
+0

Beachten Sie, dass dies R2014b oder neuer erfordert – excaza

+0

Vielen Dank. Sieht interessant aus. – maximusdooku

Verwandte Themen