Converting a date string to day of year
    88 visualizzazioni (ultimi 30 giorni)
  
       Mostra commenti meno recenti
    
Hi there I have a simple question that I can't figure out an answer to. I have a column of dates in mm/dd/yyyy format and I need to convert the dates to a Day of Year (1 to 365/366) and then export a file that has the year in column A and the Day of Year in Column B. The data set starts on Jan 1st 1957 so obviously includes leap years. Any advice would be greatly appreciated. Thanks.
0 Commenti
Risposta accettata
  Jan
      
      
 il 22 Feb 2011
        Assuming that your input data is a cell string:
DC  = {'01/02/2010'; '02/02/2010'};
DV  = datevec(DC);  % [N x 6] array
DV  = DV(:, 1:3);   % [N x 3] array, no time
DV2 = DV;
DV2(:, 2:3) = 0;    % [N x 3], day before 01.Jan
Result = cat(2, DV(:, 1), datenum(DV) - datenum(DV2));
3 Commenti
  Peter Perkins
    
 il 19 Dic 2017
				Since R2014b, using datetime is a much better choice:
>> d = datetime('now')
d = 
  datetime
   18-Dec-2017 22:20:02
>> doy = day(d,'dayofyear')
doy =
   352
Più risposte (3)
  James Tursa
      
      
 il 22 Feb 2011
        Here is an outline of code to get Day Of Year:
    >> d = '12/25/1957'
    d =
    12/25/1957
    >> v = datevec(d)
    v =
            1957          12          25           0           0           0
    >> v0 = v
    v0 =
            1957          12          25           0           0           0
    >> v0(:,2:3) = 1
    v0 =
            1957           1           1           0           0           0
    >> datenum(v) - datenum(v0) + 1
    ans =
       359
  Ian
      
 il 27 Lug 2015
        
      Modificato: Ian
      
 il 27 Lug 2015
  
      As Tursa's example implies, matlab datenum's are numeric timestamps (of type double) that can be subtracted (to get a relative offset) or added to. They are simply time elapsed (in days, & can be fractional) since Jan. 0, year 0000. (See 'doc datenum').
A slightly more complete/compact version of Tursa's answer:
    d = datevec('12/25/1957');
    v = datenum(d);                % v now == [1957 12 25];
    day = v - datenum(d(1), 1,0);  % datenum(yr,1,0) == datenum(yr-1,12,31)
Datenum( ... ) will operate on arrays of dates or datevecs, so a little creative programming can extract the day-of-year for an array of dates given as strings.
Matlab's double's are (currently) ieee 754 format, so the precision is about 1e-10 days, or ballpark 10 usecs, as the following example shows:
i
>> d1=datenum(now);
>> d2=[d1+1e-10, d1+5e-11];
>> d2==d1
ans =
   0     1
3 Commenti
  Peter Perkins
    
 il 27 Lug 2015
				Or, in R2014b or later,
>> d = datetime({'12/25/1957' '12/25/1960'})
d = 
   25-Dec-1957   25-Dec-1960
>> day(d,'dayofyear')
ans =
   359   360
>> cellstr(d,'yyyy-D')
ans = 
    '1957-359'    '1960-360'
  Toni
 il 24 Feb 2022
        If you need convert a MATLAB datetime to a string with day-of-year, 
The datestr function does not provide a format code for day-of-year. For example:
    dt = datetime(2022,2,24)
    datestr(dt,'yyyy-DDD')
results in: 2022-Thu
However, the string function can be used:
    string(dt,'yyyy-DDD')
results in: 2022-055
1 Commento
  Peter Perkins
    
 il 2 Mar 2022
				Right, and in fact datestr on a datetime is just for backwards compatibility. Even when the input is a datetime, the format is interpreted as an "old-style" datestr format. Best to not use datestr any more!
Vedere anche
Categorie
				Scopri di più su Dates and Time in Help Center e File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!







