I'm having trouble building the time series for each year separately using loops

1 view (last 30 days)
I'm having a problem with the year 1965 when I'm using loops to build each year's time series (in hours) separately
my field_day in 1965 year
in 1965 year field_day(i) = 8784
It should be 8760(365*24) but he changed to 8784(366*24) Would like to ask where is the problem, or is there a better way to build a year-by-year time series (in hours)
clear all ; clc ; clf ;
set(gcf,'color','w')
%% load data
filehtm = dir('moving_windown_test.xlsx') ;
for ii = 1 : length(filehtm);
filehtm(ii).name
[num,str,xlsdata] = xlsread(filehtm(ii).name) ; %num數值 str字串
end
time = num(:,1) ;
tide_detrend = num(:,2) ./ 1000 ;
tide = tide_detrend ;
tide_raw = tide_detrend;
%% set time
YYYY = fix(time/1000000) ;
MM = mod(fix(time/10000),100) ;
DD = mod(fix(time/100),100) ;
HH = mod(time,100) ;
tt = datenum(YYYY,MM,DD,HH,0,0) ;
%% remove outliner
for k = 1:1:5
yyyy(k) = 1960 +k;
t1 = datenum( yyyy(k),1,1) : 1/24 : datenum( yyyy(k)+1,1,1);
t1(end)=[];
%% data(依照原始數據不同)
year = YYYY;
index = find(year == yyyy(k));
t = tt(index); % movingwindown 時間
Q1(k) = prctile(tide(index), 25) ;
Q3(k) = prctile(tide(index), 75);
IQR(k) = Q3(k) - Q1(k) ;
upper(k) = Q3(k) + 1.5*IQR(k)
lower(k) = Q1(k) - 1.5*IQR(k)
tide_outline = tide(index);
raw_tide = tide(index);
tide_outline(tide_outline > upper(k) | tide_outline < lower(k)) = nan;
for j = 1 : length(t1);
if (isempty(find(t==t1(j))));
r_tide(j) = nan ;
else
r_tide(j) = tide_outline(find(t==t1(j))) ;
end
end
%% this is my problem
for i = 1 : length(t1) ;
field_day(i) = (yyyy(k)+(i - 1) * 60 * 60 / 86400/365) ;
end
plot(field_day,r_tide);hold on % rawdata
end
  3 Comments
peter huang
peter huang on 20 Feb 2022
For the variable field_day, I want to create a time series for a full year (in hours), leap year (366*24=8784), and normal year (365*24=8760)
Simon Chan
Simon Chan on 21 Feb 2022
You may use function timeshift to generate:
Tseries = dateshift(datetime(1961,1,1,0,0,0),'start','hour',0:8759);
Tseries(1:5)
ans = 1×5 datetime array
01-Jan-1961 00:00:00 01-Jan-1961 01:00:00 01-Jan-1961 02:00:00 01-Jan-1961 03:00:00 01-Jan-1961 04:00:00
Tseries(end-4:end)
ans = 1×5 datetime array
31-Dec-1961 19:00:00 31-Dec-1961 20:00:00 31-Dec-1961 21:00:00 31-Dec-1961 22:00:00 31-Dec-1961 23:00:00
Tseries = dateshift(datetime(1964,1,1,0,0,0),'start','hour',0:8783);
Tseries(1:5)
ans = 1×5 datetime array
01-Jan-1964 00:00:00 01-Jan-1964 01:00:00 01-Jan-1964 02:00:00 01-Jan-1964 03:00:00 01-Jan-1964 04:00:00
Tseries(end-4:end)
ans = 1×5 datetime array
31-Dec-1964 19:00:00 31-Dec-1964 20:00:00 31-Dec-1964 21:00:00 31-Dec-1964 22:00:00 31-Dec-1964 23:00:00

Sign in to comment.

Answers (1)

Seth Furman
Seth Furman on 28 Feb 2022
I'm not clear on the question being asked, but here's a simpler way to import the data into a timetable.
fname = "https://www.mathworks.com/matlabcentral/answers/uploaded_files/899805/moving_windown_test.xlsx";
opts = detectImportOptions(fname);
opts = setvaropts(opts, 1, "Type", "string");
t = readtable(fname, opts)
t = 43560×2 table
Var1 Var2 ____________ ____ "1961010100" -456 "1961010101" -456 "1961010102" -566 "1961010103" -656 "1961010104" -676 "1961010105" -676 "1961010106" -616 "1961010107" -456 "1961010108" -136 "1961010109" 45 "1961010110" 105 "1961010111" 146 "1961010112" 95 "1961010113" 25 "1961010114" -15 "1961010115" -66
t.Var1 = datetime(t.Var1, "InputFormat", "uuuuMMddHH")
t = 43560×2 table
Var1 Var2 ____________________ ____ 01-Jan-1961 00:00:00 -456 01-Jan-1961 01:00:00 -456 01-Jan-1961 02:00:00 -566 01-Jan-1961 03:00:00 -656 01-Jan-1961 04:00:00 -676 01-Jan-1961 05:00:00 -676 01-Jan-1961 06:00:00 -616 01-Jan-1961 07:00:00 -456 01-Jan-1961 08:00:00 -136 01-Jan-1961 09:00:00 45 01-Jan-1961 10:00:00 105 01-Jan-1961 11:00:00 146 01-Jan-1961 12:00:00 95 01-Jan-1961 13:00:00 25 01-Jan-1961 14:00:00 -15 01-Jan-1961 15:00:00 -66
tt = table2timetable(t)
tt = 43560×1 timetable
Var1 Var2 ____________________ ____ 01-Jan-1961 00:00:00 -456 01-Jan-1961 01:00:00 -456 01-Jan-1961 02:00:00 -566 01-Jan-1961 03:00:00 -656 01-Jan-1961 04:00:00 -676 01-Jan-1961 05:00:00 -676 01-Jan-1961 06:00:00 -616 01-Jan-1961 07:00:00 -456 01-Jan-1961 08:00:00 -136 01-Jan-1961 09:00:00 45 01-Jan-1961 10:00:00 105 01-Jan-1961 11:00:00 146 01-Jan-1961 12:00:00 95 01-Jan-1961 13:00:00 25 01-Jan-1961 14:00:00 -15 01-Jan-1961 15:00:00 -66
unique(dateshift)

Categories

Find more on Dates and Time 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!