필터 지우기
필터 지우기

Create a monthly date vector of serial numbers

조회 수: 38 (최근 30일)
Sandra
Sandra 2012년 1월 13일
답변: Steven Lord 2018년 8월 31일
Hi everyone,
I spent hours trying this and I am sure it must be easy but I can't get my head around it. What I want is to create a vector that contains serial numbers for each month for 30 years, so that I can use this vector for the x axis of a plot. (so e.g. I want Jan 1990, Feb 1990, March 1990 etc in serial numbers)
why doesn't something simple like this work? datenum({'01-Jan-1900':'01-Nov-2011'})
Any help is appreciated Thanks so much Sandra

채택된 답변

Oleg Komarov
Oleg Komarov 2012년 1월 13일
You are "almost" right, but what you're saying to matlab with,
datenum({'01-Jan-1900':'01-Nov-2011'})
is:
"Take the string '01-Jan-1900' (which has numeric value of 48 49 45 74 97 110 45 49 57 48 48) and apply the colon operator till the string '01-Nov-2011' (48 49 45 78 111 118 45 50 48 49 49)"
what you have to do is first convert the string to serial dates and then apply the colon...but this approach is not precise because you want one month intervals and months are irregular.
The solution is the following:
datenum(1900,1:120,1)
The months in excess of the first year will augment the year to 1901 and so on.
  댓글 수: 2
Fangjun Jiang
Fangjun Jiang 2012년 1월 13일
Excellent! Sounds like a useful trick!
Sandra
Sandra 2012년 1월 13일
Thanks so much, I knew there must be a trick:-)

댓글을 달려면 로그인하십시오.

추가 답변 (4개)

Walter Roberson
Walter Roberson 2012년 1월 13일
[Y,M] = meshgrid(1900:1929, 1:12);
TheSerialDates = datenum([Y(:), M(:), ones(numel(Y),1)]);
  댓글 수: 3
Walter Roberson
Walter Roberson 2012년 1월 13일
Thanks for catching that. I have fixed it now. I think that's the first time I ever found a use for meshgrid() !
Suene
Suene 2015년 7월 23일
This solution also worked for me. Many thanks!

댓글을 달려면 로그인하십시오.


Fangjun Jiang
Fangjun Jiang 2012년 1월 13일
x=bsxfun(@(Month,Year) datenum(Year,Month,1),(1:12).',1980:2010);
x=x(:);
diff(x)
  댓글 수: 1
Suene
Suene 2015년 7월 23일
thanks for sharing! It worked for me! :)

댓글을 달려면 로그인하십시오.


Steven Lord
Steven Lord 2018년 8월 31일
With datetime and calendarDuration there are a couple different ways to create this vector.
The first technique just adds calendar months to the starting date.
startDate = datetime('January 1, 1990');
V1 = startDate + calmonths(0:30*12-1); % 30 years = 30*12 calendar months
The second technique adds between 0 and 11 calendar months and between 0 and 29 calendar years to the starting date. This uses implicit expansion to add the months and years together to form a matrix. I reshape that matrix when I compute V2 to make it the same size and orientation as V1. If you wanted something more like a planner view, look at V2planner.
startDate = datetime('January 1, 1990');
oneYearInMonths = calmonths(0:11);
thirtyYearsInYears = calyears(0:29);
monthsPlusYears = oneYearInMonths.' + thirtyYearsInYears;
V2 = startDate + reshape(monthsPlusYears, 1, []);
V2planner = startDate + monthsPlusYears;
This next one takes advantage of the fact that the datetime function is not limited to accepting only month numbers between 1 and 12. The 13th month of 1990 is actually January 1991.
monthlist = 1:30*12;
V3 = datetime(1990, monthlist, 1);
Do these give the same result?
isequal(V1, V2)
isequal(V2, V3)
isequal(V1, V3)

Navid Ghajarnia
Navid Ghajarnia 2018년 8월 31일
This is another answer to this question:
t1 = datetime(1900,01,01);
t2 = datetime(2011,11,01);
t(:,1) = t1:t2;
Dates_Daily = [year(t), month(t)];
Dates_Monthly = unique(Dates_Daily,'rows');

카테고리

Help CenterFile Exchange에서 Time Series Objects에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by