2016-05-23 10 views
0

Ich verwende den folgenden Code, um Dateinamen alle fünf Minuten basierend auf der Anzahl der Zeitschritte zu generieren. Aber es funktioniert nicht richtig. Wenn Sie precipFileNames öffnen, sehen Sie, dass auf halbem Weg sehen, stoppt der Code es alle 5 Minuten zu tun und stattdessen tut 5 Minuten 1 Sekunde, die einen Dateinamen wie folgt erzeugt:Wie kann ich Dateinamen mit 5-Minuten-Zeitstempeln richtig erstellen?

E:\MRMS\2004\PRECIPRATE.20040402.051959.tif 

Wie kann ich dies richtig tun?

timeSteps = 417; 
pathstr = 'E:\MRMS\2004'; 
startTime = 7.320395312500000e+05; 
peakTime2 = 7.320400104166666e+05; 
precipFileNames=cell(timeSteps,1); 

for l = 1:timeSteps 
     %precipFileNames{m} = strcat(fileparts(refFile), filesep, datestr(startTime, 'yyyy'), filesep,'PRECIPRATE.',datestr(startTime, 'yyyymmdd.hhMMss'), '.tif'); 
     precipFileNames{l} = strcat(pathstr(1:end-4), datestr(startTime, 'yyyy'), filesep, 'PRECIPRATE.',datestr(peakTime2, 'yyyymmdd.hhMMss'), '.tif'); 
     peakTime2 = addtodate(peakTime2, -5, 'minute'); %No. of times we go back in time from peak time 
end 

Antwort

3

Datum/Uhrzeit wird intern mit Fließkommazahlen gespeichert. Jedes Mal während der Schleife fügen Sie einen sehr kleinen Wert (5 Minuten, 0.0035) zu einem relativ großen Wert hinzu (7e05 -ish) und dies verursacht eine Akkumulation von floating point arithmetic errors. Diese Fehler zeigen sich als geringfügige Abweichungen von Ihren erwarteten Werten.

Da Sie diese Addition (zu peakTime2) immer wieder in einer Schleife ausführen, wird der Gleitkommafehler für eine Iteration verstärkt, da die nächste Iteration vom Ergebnis der vorherigen Iteration abhängt. Vielmehr

als kontinuierlich peakTime2 Aktualisierung I würde verändern die delta Wert und es auf dem ursprünglichen Datetime-Objekt jedes Mal durch die Schleife. Auf diese Weise gibt es keine Häufung von Fehlern und Sie führen nur eine Subtraktion durch, um einen bestimmten Wert zu erhalten.

for k = 1:timeSteps 
    % Compute how many minutes to shift this iteration 
    shift = -5 * (k - 1); 

    % Apply the shift to the reference time 
    thistime = addtodate(peakTime2, shift, 'minute'); 

    % Create the filename 
    precipFileNames{k} = strcat(pathstr(1:end-4), ... 
           datestr(startTime, 'yyyy'), ... 
           filesep, ... 
           'PRECIPRATE.', ... 
           datestr(thistime, 'yyyymmdd.hhMMss'), ... 
           '.tif'); 
end 

Als Nebennote, im Interesse der Menschen Ihren Code lesen würde ich abraten sehr l als Variable verwenden, da es viel wie 1 aussieht.

+0

@maximusdooku Ich habe die Antwort mit Code aktualisiert, der dies durchführt – Suever

+0

Danke! Das funktioniert. – maximusdooku

Verwandte Themen