Converting a date string to day of year

206 ビュー (過去 30 日間)
NewbieCA
NewbieCA 2011 年 2 月 21 日
コメント済み: Peter Perkins 2022 年 3 月 2 日
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.

採用された回答

Jan
Jan 2011 年 2 月 22 日
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 件のコメント
Siyavuya Madlanga
Siyavuya Madlanga 2017 年 12 月 6 日
Thank you very much
Peter Perkins
Peter Perkins 2017 年 12 月 19 日
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

サインインしてコメントする。

その他の回答 (3 件)

James Tursa
James Tursa 2011 年 2 月 22 日
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
  1 件のコメント
NewbieCA
NewbieCA 2011 年 2 月 22 日
Thanks for this

サインインしてコメントする。


Ian
Ian 2015 年 7 月 27 日
編集済み: Ian 2015 年 7 月 27 日
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 件のコメント
Peter Perkins
Peter Perkins 2015 年 7 月 27 日
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'
K E
K E 2016 年 5 月 19 日
編集済み: K E 2016 年 5 月 19 日
Wish I could vote on comments like StackOverflow - Peter's was useful for me.

サインインしてコメントする。


Toni
Toni 2022 年 2 月 24 日
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 件のコメント
Peter Perkins
Peter Perkins 2022 年 3 月 2 日
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!

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeCalendar についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by