Ho una grande serie temporale (~ 250.000) di valori di stato dell'analizzatore di dati minuti (valori di caratteri). I valori sono NORMAL per quando l'analizzatore funziona normalmente e CALIB durante la calibrazione. Le calibrazioni avvengono giornalmente ma a orari diversi (non tutti i giorni alla stessa ora) e durano per varie durate solitamente intorno ai 30 minuti. Ogni punto dati di un minuto è dotato di timestamp. Devo assegnare a ciascun periodo di calibrazione (dall'inizio dello stato di calibrazione CALIB alla fine dello stato di calibrazione CALIB per un determinato giorno) un identificatore univoco e generare una tabella con l'ora di inizio e di fine per ciascun periodo di calibrazione.
Sono un principiante assoluto in JSL. Qualcuno può fornire un esempio di come potrei realizzare questo con JSL?
Grazie in anticipo per qualsiasi aiuto.
Si prega di trovare un approccio (senza dubbio tra molti). L'uso della tabella di riepilogo consente il collegamento alla tabella di origine, che potrebbe essere utile. Esegui 'File > Nuovo > Nuovo script', taglia e incolla il codice sottostante, quindi 'Modifica > Esegui script'.
NamesDefaultToHere(1);
// Make some fake data to play with
n = 1000;
startDate = Date DMY( 01, 1, 2016 );
endDate = Date DMY( 12, 10, 2016 );
dates = Sort Ascending(J( n, 1, Random Integer(startDate, endDate) ) );
status = J( n, 1, Random Integer(1, 2) );
dt1 = New Table( "Callibrations",
New Column( "Date", Numeric, "Continuous", Format( "ddMonyyyy h:m", 35 ), Set Values( dates )),
New Column( "Status", Numeric, "Nominal", Set Values( status ), Value Labels( {1 = "NORMAL", 2 = "CALIB"} ) )
);
/************************************************************************************************/
/* Start here . . . */
/************************************************************************************************/
dt1 = CurrentDataTable();
// Define a column that increments when the 'Status' changes:
// https://community.jmp.com/t5/Discussions/Formula-for-automatic-counter-by-group-of-rows/td-p/20120
dt1 << New Column( "Counter", Numeric, "Ordinal", Formula( If( Row() == 1, 1, Lag( :Counter, 1 ) + (Lag( :Status, 1 ) != :Status)) ) );
// Get the start dates
dt1 << New Column( "Start Date", Numeric, "Continuous", Format( "ddMonyyyy h:m", 35 ), Formula( Col Min( :Date, :Counter ) ));
// Get the end dates
dt1 << New Column( "End Date", Numeric, "Continuous", Format( "ddMonyyyy h:m", 35 ), Formula( Col Max( :Date, :Counter ) ));
// Make the required summary table
dt2 = dt1 << Summary(
Group( :Counter, :Status ),
Min( :Start Date ),
Max( :End Date ),
statistics column name format( "column" ),
output table name( "Calibration Periods" )
);
dt2 << deleteProperty("Source");