MATLAB Answers

Extracting and plotting max/min values from timeseries

36 ビュー (過去 30 日間)
Lindazeta
Lindazeta 2020 年 5 月 12 日
コメント済み: Lindazeta 2020 年 5 月 13 日
I have a time series with continuous measurements of pH. The measurements are every 5 minutes, and the timeseries is a total of 13 days.
I want to find and plot the max and min value for each day, where the max and min values are based on 24 observations of a mean pH/hour.
So far I've been able to get the mean pH per hour, but I don't know how to find the max/min values from these and then plot as a continuous time series.
This is what I've done so far to find the mean pH for every hour:
dnv = [time];
dv6 = datevec(dnv); % Date vector matrix, 6 columns
dn4 = datenum([dv6(:,1:4) repmat([0 0],size(dv6,1),1)]);
[Du,~,di] = unique(dn4, 'stable');
Means = accumarray(di, pH, [], @mean); % Creating means for every hour
Out = [datevec(Du) Means]; % Output separated columns, date time mean
de = datetime(Out(:,1:6)); % Merged date and time back into 1 column
So, how do I find the max and min values with the associated date and time for plotting?

  0 件のコメント

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

採用された回答

Peng Li
Peng Li 2020 年 5 月 12 日
Better take advantage of table format and splitapply function.
tbl = readtable('data.csv');
tbl.day = day(tbl.Date);
tbl.hour = hour(tbl.Date);
[Group, hourTbl] = findgroups(tbl(:, {'day', 'hour'}));
hourTbl.mean = splitapply(@nanmean, tbl.pH, Group);
[Group, dayTbl] = findgroups(hourTbl(:, 'day'));
dayTbl.max = splitapply(@max, hourTbl.mean, Group);
dayTbl.min = splitapply(@min, hourTbl.mean, Group);

  4 件のコメント

表示 1 件の古いコメント
Peng Li
Peng Li 2020 年 5 月 12 日
Modified a bit to show max pH and the corresponding max time. It's a bit twisted but it's working.
tbl = readtable('data.csv');
tbl.year = year(tbl.Date);
tbl.month = month(tbl.Date);
tbl.day = day(tbl.Date);
tbl.hour = hour(tbl.Date);
[Group, hourTbl] = findgroups(tbl(:, {'year', 'month', 'day', 'hour'}));
hourTbl.mean = splitapply(@nanmean, tbl.pH, Group);
[Group, dayTbl] = findgroups(hourTbl(:, {'year', 'month', 'day'}));
temp = splitapply(@(x, y) mymax(x, y), hourTbl.mean, hourTbl.hour, Group);
dayTbl.maxHour = temp(:, 2);
dayTbl.maxpH = temp(:, 1);
dayTbl.time = datetime(dayTbl.year, dayTbl.month, dayTbl.day, dayTbl.maxHour, 0, 0);
function out = mymax(ph, time)
[m, ind] = max(ph);
out = [m, time(ind)];
end
Lindazeta
Lindazeta 2020 年 5 月 13 日
Awesome! Thanks! One last question though... How do I add the min values? I tried re-writing it but my matlab skills are not great...
Lindazeta
Lindazeta 2020 年 5 月 13 日
Oh never mind, I made it work! Thank you so much for your help!

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

その他の回答 (0 件)

製品


リリース

R2019b

Community Treasure Hunt

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

Start Hunting!

Translated by