# Dealing with leap years, creating arrays of yearly data

10 ビュー (過去 30 日間)
SMA 2016 年 4 月 12 日
コメント済み: dpb 2017 年 8 月 13 日
I have a time series in a Nx1 array where N are the number of days (different for each dataset, but lets take days from 1951 till 2007). Leap years are included (1952, 1956, ...). I am trying to convert the array into 366x57 (57 being the number of years between 1951-2007), by adding Nan at the Feb 29th (60th) position for non-leap years. I am sure there is a simple solution which I am having a hard time devising. Is there a way to accomplish this without loops.

サインインしてコメントする。

### 採用された回答

the cyclist 2016 年 4 月 12 日
Here is an example using two years, one leap and one not. Should be easy for you to see how to generalize.
% Time series with one leap year and one not
T = rand(365+366,1);
% The years
Y = 1951:1952;
numberYears = numel(Y);
% Slick way to identify the leap years
isLeapYear = datenum(Y,2,29)~=datenum(Y,3,1);
T_new = nan(366,numberYears);
for ny = 1:numberYears
numberDaysThisYear = 365+isLeapYear(ny);
T_new(1:numberDaysThisYear,ny) = T(1:numberDaysThisYear);
T(1:numberDaysThisYear) = []; % Deletes T as you go. Could do this differently
end
##### 3 件のコメント表示 2 件の古いコメント非表示 2 件の古いコメント
dpb 2017 年 8 月 13 日
"% Slick way to identify the leap years"
My favorite is one of my standard utilities...
function is=isleapyr(yr)
% returns T for input year being a leapyear
is=eomday(yr,2)==29;

サインインしてコメントする。

### カテゴリ

Find more on Numeric Types 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!

Translated by