Ich habe eine große Zeitreihe (~ 250.000) von winzigen Statuswerten des Datenanalysators (Zeichenwerte). Die Werte sind NORMAL, wenn der Analysator normal arbeitet, und CALIB während der Kalibrierung. Die Kalibrierungen erfolgen täglich, aber zu unterschiedlichen Zeiten (nicht jeden Tag zur gleichen Zeit) und dauern für unterschiedliche Zeiträume, normalerweise etwa 30 Minuten. Jeder einminütige Datenpunkt ist mit einem Zeitstempel versehen. Ich muss jedem Kalibrierungszeitraum (vom Beginn des Kalibrierungsstatus CALIB bis zum Ende des Kalibrierungsstatus CALIB für einen bestimmten Tag) eine eindeutige Kennung zuweisen und eine Tabelle mit den Start- und Endzeiten für jeden Kalibrierungszeitraum erstellen.
Ich bin absoluter Neuling bei JSL. Kann jemand ein Beispiel dafür geben, wie ich dies mit JSL erreichen könnte?
Vielen Dank im Voraus für jede Hilfe.
Bitte finden Sie einen Ansatz (ohne Zweifel von vielen). Die Verwendung der Zusammenfassungstabelle ermöglicht das Verknüpfen mit der Quelltabelle, was nützlich sein kann. Führen Sie „Datei > Neu > Neues Skript“ aus, schneiden Sie den folgenden Code aus und fügen Sie ihn ein, und klicken Sie dann auf „Bearbeiten > Skript ausführen“.
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");