Create a monthly date vector of serial numbers
Show older comments
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
Accepted Answer
More Answers (4)
Walter Roberson
on 13 Jan 2012
[Y,M] = meshgrid(1900:1929, 1:12);
TheSerialDates = datenum([Y(:), M(:), ones(numel(Y),1)]);
3 Comments
Fangjun Jiang
on 13 Jan 2012
The order is not right. diff(TheSerialDates ) will show it.
Walter Roberson
on 13 Jan 2012
Thanks for catching that. I have fixed it now. I think that's the first time I ever found a use for meshgrid() !
Suene
on 23 Jul 2015
This solution also worked for me. Many thanks!
Fangjun Jiang
on 13 Jan 2012
x=bsxfun(@(Month,Year) datenum(Year,Month,1),(1:12).',1980:2010);
x=x(:);
diff(x)
1 Comment
Suene
on 23 Jul 2015
thanks for sharing! It worked for me! :)
Steven Lord
on 31 Aug 2018
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
on 31 Aug 2018
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');
Categories
Find more on Time Series Objects in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!