Adding rows to matrix conditionally

3 ビュー (過去 30 日間)
HOl 2020 年 3 月 31 日
コメント済み: HOl 2020 年 4 月 1 日
I have long datafiles that I need to alter and cannot figure out how to do this.
The simplified version of what I'm trying to do is:
x = 1 20
3 50
6 10
Column 1 is time (t) (sec 1, 3, 6) and col 2 the values.
I want to create a new matrix with time axis with 1 sec interval and that the values (col 2) are repeated until next (t) ( in col1)
The resulting matrix should be:
x2 = 1 20
2 20
3 50
4 50
5 50
6 10
Sorry about the elementery question, I'm a newby
  1 件のコメント
Star Strider
Star Strider 2020 年 3 月 31 日
I will defer to Guillaume’s Answer, since he posted the solution first. The data file is attached.



Guillaume 2020 年 3 月 31 日
We don't have enough details to give you a complete answer but what you want to do should be easily done by
  • reading your file as a timetable. Could be as easy as:
data = readtimetable(yourfile);
depending on the actual file
  • retime the timetable to 1 second interval, which is simply:
resampled = retime(data, 'secondly', 'previous'); %retime in one second interval using the previously known value for the missing times
  • save into a new file
writetimetable(resampled, 'newfile.csv');
for example
  6 件のコメント
Guillaume 2020 年 4 月 1 日
You can construct a new time vector starting at the time of your choosing and pass that to retime instead of letting it construct it:
newtimes = (tdata.DateTimeUnified(1):seconds(30):tdata.DateTimeUnified(end)+seconds(30))';
resampled = retime(tdata, newtimes, 'previous');
HOl 2020 年 4 月 1 日
Excellent, that works. Thank you very much!!
For any other newby's out there with wonky data here is the final code:
>> opts = detectImportOptions('data.csv'); %have to use import options because of the wonky format of the file
>> opts = opts.setvartype(3, 'char');
>> data = readtable('data.csv', opts); %import as table
>> data.(3) = duration(strrep(data.(3), ' PM', '')); %get rid of the useless PM, then convert to duration
>> data.DateTimeUnified = data.(2) + data.(3) + seconds(data.(4) / 1e6); %convert microseconds to seconds and add the whole lot
>> data.DateTimeUnified.Format = 'dd MMM yyyy HH:mm:ss.SSSSSS';
>> data(end, :) = []; %get rid of the last row which is nonsense
>> tdata = table2timetable(data, 'RowTimes', 'DateTimeUnified'); %convert to timetable
>> newtimes = (tdata.DateTimeUnified(1):seconds(30):tdata.DateTimeUnified(end)+seconds(30))';
>> resampled = retime(tdata, newtimes, 'previous');


その他の回答 (1 件)

Andrei Bobrov
Andrei Bobrov 2020 年 3 月 31 日
out = [(x(1,1):x(end,1))',repelem(x(:,2),[diff(x(:,1));1])];


Help Center および File ExchangeTimetables についてさらに検索



Community Treasure Hunt

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

Start Hunting!

Translated by