J'ai une grande série chronologique (~ 250 000) de valeurs d'état d'analyseur de données minute (valeurs de caractères). Les valeurs sont NORMAL lorsque l'analyseur fonctionne normalement et CALIB pendant l'étalonnage. Les étalonnages ont lieu quotidiennement mais à des moments différents (pas à la même heure tous les jours) et durent pendant des durées variées, généralement autour de 30 minutes. Chaque point de données d'une minute est horodaté. Je dois attribuer à chaque période d'étalonnage (du début de l'état cal CALIB à la fin de l'état cal CALIB pour un jour donné) un identifiant unique et générer un tableau avec les heures de début et de fin pour chaque période d'étalonnage.
Je suis complètement novice chez JSL. Quelqu'un peut-il donner un exemple de la façon dont je pourrais accomplir cela avec JSL?
Merci d'avance pour votre aide.
Veuillez trouver une approche (sans doute parmi plusieurs). L'utilisation du tableau récapitulatif permet d'établir un lien vers le tableau source, ce qui peut être utile. Faites 'Fichier > Nouveau > Nouveau Script', coupez et collez le code ci-dessous, puis 'Edition > Exécuter le 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");