How do I create a vector with the first day of each month?
    3 visualizzazioni (ultimi 30 giorni)
  
       Mostra commenti meno recenti
    
How do I create a column vector with the first day of each month? Considering I have a list of days...
3 Commenti
  Jan
      
      
 il 27 Apr 2013
				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')]
Risposta accettata
  John Doe
      
 il 27 Apr 2013
        
      Modificato: John Doe
      
 il 27 Apr 2013
  
      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 Commenti
  Jan
      
      
 il 27 Apr 2013
				@Robert: Nicer and more efficient:
weekdays = {'Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'};
Più risposte (1)
  Jan
      
      
 il 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.
Vedere anche
Categorie
				Scopri di più su Time Series Objects in Help Center e File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


