How to use datenum with a date represented as a scaler?
조회 수: 1 (최근 30일)
이전 댓글 표시
I have data I need to ingest that is date specific however, the data is represented as a scaler e.g. 20180924 with no spaces or hyphens. How do I get datenum to take this date in and separate it out into a vector so I can use it?
댓글 수: 3
Stephen23
2018년 9월 24일
@Eric Metzger: do you need to convert one such integer, or multiple integers?
채택된 답변
Kelly Kearney
2018년 9월 24일
Is your final goal to convert to a datenumber or an year-month-day array? As mentioned in the other answers, if you're using a recent version of Matlab, datetimes are more flexible than datenumbers. Once you've converted the value to a datetime, you can move between datenumbers and datevectors pretty easily:
x = [20180924];
>> t = datetime(num2str(x, '%08d'), 'inputFormat', 'yyyyMMdd')
t =
datetime
24-Sep-2018
>> datenum(t)
ans =
737327
>> datevec(t)
ans =
2018 9 24 0 0 0
댓글 수: 4
Stephen23
2018년 9월 24일
@Eric Metzger: read about the formatSpec:
and inputFormat:
Kelly Kearney
2018년 9월 24일
Specifically in the this case, it makes sure the answer is robust to dates earlier than year 1000 by padding any less-than-4-digit years with zeros. (Datetime is actually smart enough to figure things out even without the padding... but I like to be explicit just in case.) Note that this will fail if you're dealing with any BC dates, but I'm assuming you would have specified if that was the case.
추가 답변 (3개)
ANKUR KUMAR
2018년 9월 24일
If A is numeric, then
A=20180924
a1=num2str(A)
datenum(str2double({a1(1:4),a1(5:6),a1(7:8)}));
If you wish to store date in vector, then
A1=[str2double({a1(1:4),a1(5:6),a1(7:8)})]
댓글 수: 6
Stephen23
2018년 9월 24일
Note that the square brackets around str2double are totally superfluous:
Walter Roberson
2018년 9월 24일
datetime(TheScalar, 'ConvertFrom', 'yyyymmdd')
You can convert the result to datenum if you insist: just double() the datetime
댓글 수: 3
Steven Lord
2018년 9월 24일
I would use the ymd function or the datevec function on the datetime object.
theScalar = 20180924
dt = datetime(theScalar, 'ConvertFrom', 'yyyymmdd')
[y, m, d] = ymd(dt)
DV = datevec(dt)
You can even go from the date vector back to a datetime.
dt2 = datetime(DV)
isequal(dt, dt2)
Walter Roberson
2018년 9월 24일
It isn't clear what result is being looked for. If it is separated parts, with the implementation of sprintf -> str2num -> datenum -> datevec being considered, then my numeric code computes the pieces directly without needing any calls more expensive then mod.
Peter Perkins
2018년 10월 1일
If possible, use datetime rather than datenum/datestr/datevec. As Walter showed, you can convert directly from numeric to datetime. It's also possible that you do not need to store the separate pieces, since datetime lets you get at them any time you want, as a property.
댓글 수: 0
참고 항목
카테고리
Help Center 및 File Exchange에서 Dates and Time에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!