Extract changes on a string
    3 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    Arthur Romeu
 el 8 de En. de 2020
  
    
    
    
    
    Comentada: Star Strider
      
      
 el 10 de En. de 2020
            Hello everyone,
I am trying to come up with a solution for the following:
I have two vars with the same size: "status" and "dates". "status" refers to different status on an equipment, and I need only the cells where a change in status occurs. Let me illustrate
'Online'     %01
'Online'     %02
'Online'     %03
'Online'     %04
'Online'     %05
'Online'     %06
'Offline'    %07
'Offline'    %08
'Offline'    %09
'Offline'    %10
'Offline'    %11
'Offline'    %12
I need to extract from a list like this only lines like 06 and 07, which is the last entry of one status and the first entry of the other. However, it's not just that. I also have the "dates"  on datetime, and they all correspond with each cell on "status". So in order to preserve the date information of each cell, I need to, in this example, get the information on lines 06 and 07 of the "status" list and also the date on lines 06 and 07 of the "dates" list.
I have no idea of where to begin with this code :(
I hope I explained everything as clearly as possible. I'm sending the referred lists as an attachment for better understanding.
Thanks in advance,
Arthur.
0 comentarios
Respuesta aceptada
  Star Strider
      
      
 el 8 de En. de 2020
        
      Editada: Star Strider
      
      
 el 9 de En. de 2020
  
      Try this: 
D1 = load('status.mat');
D2 = load('dates.mat');
status = string(D1.fontes);
datestimes = D2.data_tracking_tratado;
StatG = findgroups(status);                                 % Create Numeric Labels For States
GrpID = unique(StatG);                                      % Unique Labels
Trns = nchoosek(GrpID, 2);                                  % Combinations Of All Status Changes
Trns = [Trns; fliplr(Trns)];                                % Combinations Of All Status Changes
for k = 1:size(Trns,1)
    StChng{k,:} = strfind(StatG.', Trns(k,:));              % First Index Of Status Changes — Indices Into Both ‘status’ & ‘datestimes’|
    StChngIx{k,:} = Trns(k,:);                              % Associated Numeric Vector (Information Only)
end
StChngNE = cellfun(@(x) ~isempty(x), StChng);               % Index To Delete Empty Entries
StChng = StChng(StChngNE);                                  % Delete Empty Entries
StChngIx = StChngIx(StChngNE);                              % Delete Empty Entries
for k = 1:size(StChng,1)                                    % Loop To Create Output Cell Arrays
    Idx = StChng{k,1};
    Out{1,k} = status(Idx);
    Out{2,k} = status(Idx+1);
    Out{3,k} = datestimes(Idx);
    Out{4,k} = datestimes(Idx+1);
end
EDIT — (8 Jan 2020 at 21:45)
Added table code: 
Outt = Out.';                                               % Transpose To (Nx4)
Status = [];
DatesTimes = [];
for k = 1:size(Outt,1)
    Status = [Status; Outt{k,[1 2]}];
    DatesTimes = [DatesTimes; Outt{k,[3 4]}];
end
StatusChanges = table(Status(:,1), Status(:,2), DatesTimes(:,1), DatesTimes(:,2), 'VariableNames',{'Status 1','Status 2','Time 1','Time 2'})
Producing: 
StatusChanges =
      Status 1        Status 2             Time 1                  Time 2       
    ____________    ____________    ____________________    ____________________
    "Offline"       "Soft Start"    01-Jan-2020 16:18:00    01-Jan-2020 16:19:00
    "Offline"       "Soft Start"    02-Jan-2020 12:34:00    02-Jan-2020 12:35:00
    "Offline"       "Test"          03-Jan-2020 09:02:00    03-Jan-2020 09:03:00
    "Soft Start"    "Test"          03-Jan-2020 09:55:00    03-Jan-2020 09:56:00
    "Online"        "Offline"       01-Jan-2020 12:15:00    01-Jan-2020 12:16:00
    "Online"        "Offline"       02-Jan-2020 08:23:00    02-Jan-2020 08:24:00
    "Online"        "Offline"       03-Jan-2020 05:50:00    03-Jan-2020 05:51:00
    "Soft Start"    "Online"        01-Jan-2020 16:39:00    01-Jan-2020 16:40:00
    "Soft Start"    "Online"        02-Jan-2020 13:06:00    02-Jan-2020 13:07:00
    "Soft Start"    "Online"        03-Jan-2020 10:52:00    03-Jan-2020 10:53:00
    "Test"          "Soft Start"    03-Jan-2020 09:52:00    03-Jan-2020 09:53:00
    "Test"          "Soft Start"    03-Jan-2020 10:31:00    03-Jan-2020 10:32:00
EDIT — (9 Jan 2020 at 02:10)
Corrected typographical errors.  
2 comentarios
  Star Strider
      
      
 el 10 de En. de 2020
				As always, my pleasure!  
I very much appreciate your compliment!  
I’ve been programming on and off for a while.  I took my first course in FORTRAN as an undergraduate in 1968, and was introduced to MATLAB in 1994.  (I also had a career as a physician and biomedical engineer, now retired from both.)  
I noticed that the rows are not chronological.  To sort them by ‘Time 1’, add this line after the ‘StatusChanges’ table assignment: 
StatusChanges = sortrows(StatusChanges,{'Time 1'});
Producing: 
StatusChanges =
      Status 1        Status 2             Time 1                  Time 2       
    ____________    ____________    ____________________    ____________________
    "Online"        "Offline"       01-Jan-2020 12:15:00    01-Jan-2020 12:16:00
    "Offline"       "Soft Start"    01-Jan-2020 16:18:00    01-Jan-2020 16:19:00
    "Soft Start"    "Online"        01-Jan-2020 16:39:00    01-Jan-2020 16:40:00
    "Online"        "Offline"       02-Jan-2020 08:23:00    02-Jan-2020 08:24:00
    "Offline"       "Soft Start"    02-Jan-2020 12:34:00    02-Jan-2020 12:35:00
    "Soft Start"    "Online"        02-Jan-2020 13:06:00    02-Jan-2020 13:07:00
    "Online"        "Offline"       03-Jan-2020 05:50:00    03-Jan-2020 05:51:00
    "Offline"       "Test"          03-Jan-2020 09:02:00    03-Jan-2020 09:03:00
    "Test"          "Soft Start"    03-Jan-2020 09:52:00    03-Jan-2020 09:53:00
    "Soft Start"    "Test"          03-Jan-2020 09:55:00    03-Jan-2020 09:56:00
    "Test"          "Soft Start"    03-Jan-2020 10:31:00    03-Jan-2020 10:32:00
    "Soft Start"    "Online"        03-Jan-2020 10:52:00    03-Jan-2020 10:53:00
The ‘StatusChanges’ table is now sorted chronologically!  
Más respuestas (0)
Ver también
Categorías
				Más información sobre Logical en Help Center y File Exchange.
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!