# How to extract certain values in an array

5 views (last 30 days)
Vishal Varadraj on 1 Nov 2021
Commented: Adam Danz on 3 Nov 2021
I have a vector containing n rows (dependent on user input) and two columns. The first column is the time every minute and the second being the power at each time. I want to find the power from 08:00 to 17:00 everyday. Picture below shows this array. I converted the char array to a double thinking it could be easier. I would have to do this for all the days in the month or could be from the 15th of one month to the 18th of the next. I also have the datenum values for the time as shown below. I feel using this would be better as it would uniquely identify each day, minute and month without using a numerical method ie using modulus to find the first two values in the cell and sprintf. I've also attached a sample of my code where SM,SD,SH,EM,ED,EH are Start month, day, hour and End Month, Day, Hour given by the user. I have a database of the weather files which contains the outside air temp by the hour from which I find the power out at each minute. Start and end time defined by the user ex 062311 meaning the 6th month, 23rd day and 11th hour.
%% Extracts Required Weather Temperature
m = floor(log10(Start));
D = mod(floor(Start ./ 10 .^ (m:-1:0)), 10);
if length(D) == 5
SM = D(1);
str = sprintf('%d%d%d', D(2), D(3));
SD= str2double(str);
str = sprintf('%d%d%d', D(4), D(5));
SH= str2double(str);
else
str = sprintf('%d%d%d', D(1), D(2));
SM= str2double(str);
str = sprintf('%d%d%d', D(3), D(4));
SD= str2double(str);
str = sprintf('%d%d%d', D(5), D(6));
SH= str2double(str);
end
%% Getting Time Values for the Plot
t1 = datetime(Year(1),SM,SD,SH,0,0);
t2 = datetime(Year(1),EM,ED,EH,1,0);
t11=datevec(datenum(t1));
t22=datevec(datenum(t2));
time_interval = etime(t22,t11)/60;
for c = 1:time_interval
time(c) = t1 +minutes(c);
end
c=datestr(time, 'mm dd HH:MM');
timestamp=datenum(c, 'mm dd HH:MM');
Thanks in Advance
##### 2 CommentsShowHide 1 older comment
Vishal Varadraj on 1 Nov 2021
@David Hill Sure, I have attached my workspace containg the double column vector, the char array, datenum array. Let me know if you require anything else.

Sign in to comment.

### Accepted Answer

Adam Danz on 1 Nov 2021
Use datetime values instead of any other form of date/time. That allows you to easily index by hour etc.
% Load the data
data = load('matlab3.mat');
% Convert timestamp to datetime values
dtStamp = datetime(data.timestamp,'ConvertFrom','datenum')
dtStamp = 44581×1 datetime array
23-Jun-2021 01:01:00 23-Jun-2021 01:02:00 23-Jun-2021 01:03:00 23-Jun-2021 01:04:00 23-Jun-2021 01:05:00 23-Jun-2021 01:06:00 23-Jun-2021 01:07:00 23-Jun-2021 01:08:00 23-Jun-2021 01:09:00 23-Jun-2021 01:10:00 23-Jun-2021 01:11:00 23-Jun-2021 01:12:00 23-Jun-2021 01:13:00 23-Jun-2021 01:14:00 23-Jun-2021 01:15:00 23-Jun-2021 01:16:00 23-Jun-2021 01:17:00 23-Jun-2021 01:18:00 23-Jun-2021 01:19:00 23-Jun-2021 01:20:00 23-Jun-2021 01:21:00 23-Jun-2021 01:22:00 23-Jun-2021 01:23:00 23-Jun-2021 01:24:00 23-Jun-2021 01:25:00 23-Jun-2021 01:26:00 23-Jun-2021 01:27:00 23-Jun-2021 01:28:00 23-Jun-2021 01:29:00 23-Jun-2021 01:30:00
% Extract the hour of each timestamp
hr = hour(dtStamp); % numeric integers 0:23
hr = 44581×1
1 1 1 1 1 1 1 1 1 1
% Index hours between 8 and 17
idx = hr>8 & hr<17;
I don't know how you're planning on using the results but idx is a logical index identifying the rows of data that are between the specified hours.
##### 4 CommentsShowHide 3 older comments
Adam Danz on 3 Nov 2021
Thanks, I fixed it. It should be, max(count).

Sign in to comment.

R2021a

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!