MATLAB Answers

cfjunior
0

How do I create a vector with the first day of each month?

Asked by cfjunior
on 27 Apr 2013

How do I create a column vector with the first day of each month? Considering I have a list of days...

  3 Comments

Please explain what "I have a list of dates" exactly means. Guessing the type and size of the inputs would be an inefficient approach.

a list of days would be a column vector that goes from 10/01/1998 till 06/31/1999 in numbers

And example in valid Matlab syntax would be more helpful. The input is still not clear. Something like this would be much easier to understand:

data = [datenum('10/01/1998'), datenum('06/31/1999')]

Products

No products are associated with this question.

2 Answers

Answer by John Doe
on 27 Apr 2013
Edited by John Doe
on 27 Apr 2013
 Accepted answer

Not quite sure what you are asking for here.

I assume you have a vector with all days from Monday-Sunday, and you know which day the first day of the year is:

weekdays = [{'Monday'},{'Tuesday'},{'Wednesday'},{'Thursday'},{'Friday'},{'Saturday'},{'Sunday'}];
dayNumber = zeros(1,12);
dayNumber(1) = 2;       % 2013 started on a Tuesday.
numDays = [31 28 31 30 31 30 31 31 30 31 30 31];  % Not a leap year
for i = 1:11
  dayNumber(i+1) = mod((dayNumber(i)+days(i)-1),7)+1; 
end
for i = 1:12
  dayName(i) = weekdays(dayNumber(i));
end

If you need to account for leap years: It is a leap year every fourth year, except years that can be divided by 100, except years that can be divided by 400.

A general approach would be something like this:

year = 2013;
year0 = 1900;
startDay = 1;  % Year 1900 started on a monday.
if year > year0
  for i = 1:(year-year0)
    if mod((year0+i),4)~=0
      startDay = startDay + 365;
    elseif mod((year0+i),4)==0 && mod((year0+i),100)~=0
      startDay = startDay + 366;
    elseif mod((year0+i),4)==0 && mod((year0+i),100)==0 && mod((year0+i),400)~=0
      startDay = startDay + 365;
    elseif mod((year0+i),4)==1 && mod((year0+i),400)==0
      startDay = startDay + 366;
    end
  end
end
dayNumber = mod(startDay,7)+1;

This gives dayNumber = 2, for year = 2013. Then continue with the code above. (numDays(2)=29, if leap year)

  2 Comments

@Robert: Nicer and more efficient:

weekdays = {'Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'};

Answer by Jan Simon
on 27 Apr 2013

indata = datenum('10/01/1998'):datenum('06/31/1999');
dvec   = datevec(data);
duniq  = unique(dvec(:, 1:2), 'rows');
result = datenum(v(:,1), v(:,2), 1);

Now result contains a row vector of the serial date numbers of the first day of each month contained in the input data.

  1 Comment


Join the 15-year community celebration.

Play games and win prizes!

Learn more
Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

MATLAB Academy

New to MATLAB?

Learn MATLAB today!