Tengo una gran serie temporal (~ 250,000) de valores de estado del analizador de datos por minuto (valores de caracteres). Los valores son NORMALES para cuando el analizador funciona normalmente y CALIB durante la calibración. Las calibraciones ocurren a diario pero a varias horas (no a la misma hora todos los días) y duran varias duraciones, generalmente alrededor de 30 minutos. Cada punto de datos de un minuto tiene una marca de tiempo. Necesito asignar a cada período de calibración (desde el comienzo del estado de calibración CALIB hasta el final del estado de calibración CALIB para un día determinado) un identificador único y generar una tabla con las horas de inicio y finalización para cada período de calibración.
Soy un novato en JSL. ¿Alguien puede dar un ejemplo de cómo podría lograr esto con JSL?
Gracias de antemano por cualquier ayuda.
Encuentre un enfoque (sin duda de muchos). El uso de la tabla de resumen permite vincular a la tabla de origen, lo que puede ser útil. Haga 'Archivo> Nuevo> Nuevo guión', corte y pegue el código a continuación, luego 'Editar> Ejecutar guión'.
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");