Re: La forma más eficiente de agregar información a las filas haciendo coincidir la marca de tiempo de dos tablas de datosHay bastantes opciones para hacer esto (especialmente con secuencias de comandos).Es posible que pueda crear una consulta SQL utilizando JMP Query Builder en el menú Tablas (puede usar tablas de datos con él) en la que puede definir los rangos y cómo se deben unir las filas.
Re: ¿La forma más eficiente de agregar información a las filas haciendo coincidir la marca de tiempo de dos tablas de datos?Aquí está mi enfoque.Si los datos están ordenados, se pueden pasar una vez y se pueden encontrar los valores necesarios.Eche un vistazo al JSL a continuación para conocer el enfoque general a seguir.El código no está probado, no tengo tablas de datos para probarlo.Sin embargo, he usado este enfoque muchas veces antes y es un enfoque eficiente.Pero prepárate para ajustarlo un poco.
Names Default To Here( 1 );
dt = Current Data Table();
nr = N Rows( dt );
dtPDTag = Data Table( "2205 - 2209 PD3102" );
nrPD = N Rows( dtPDTag );
// Sort both data tables by the timestamps to allow the tables to only
// have to be read once
// Before sorting the data, if the tables need to be returned to the
// original order then create a new column in each table that represents
// the current Row number, which then will allow the table to be sorted
// back to the original order
// dt << New Column( "_row_", set each value( Row() ));
// dtPDTag << New Column( "_row_", set each value( Row() ));
dt << sort( By( :StartTime, :EndTime ), order( ascending, ascending ), replace table( 1 ) );
dtPDTag << sort( By( :DateTime ), order( ascending ), replace table( 1 ) );
PDStart = 1; // Variable that keeps track of where in the dtPDTag table to start to find values
For( dtI = 1, dtI <= nr, dtI++,
For( dtPDI = PDStart, dtPDI <= nrPD, dtPDI++,
If( ( dtPDTag:DateTime[dtPDI] > dt:StartTime[dtI] ) & ( dtPDTag:DateTime[dtPDI] < dt:EndTime ),
dtPDTag:PO[dtPDI] = dt:PO[dtI];
dtPDTag:Symbol[dtPDI] = dt:Symbol[dtI];
PDStart = dtPDI;
Break();
)
);
// Resort to original if required and delete the _row_ column
// dt << sort( By( _row_ ), order( ascending ), replace table( 1 ) );
// dt << delete columns( :_row_ );
// dtPDTag << sort( By( _row_ ), order( ascending ), replace table( 1 ) );
// dtPDTag << delete columns( :_row_ );
Re: ¿La forma más eficiente de agregar información a las filas haciendo coincidir la marca de tiempo de dos tablas de datos?gracias jim Para verificar la interpretación versus mi código no tan eficiente:
- Introduce PDStart como un contador para evitar pasar una y otra vez por las filas que ya han sido respondidas
- Incluyes Break(); para salir del bucle lo antes posible para hacerlo
En resumen, ¿con estas dos adiciones eliminas la redundancia que era inherente a mi código?
Re: ¿La forma más eficiente de agregar información a las filas haciendo coincidir la marca de tiempo de dos tablas de datos?¡Correcto!
Re: ¿La forma más eficiente de agregar información a las filas haciendo coincidir la marca de tiempo de dos tablas de datos?Hola,
Me doy cuenta de que llego tarde a esto. Decidí responder porque tenía una necesidad similar cuando trabajaba en semi, y mi tabla de datos era tan grande que incluso un solo bucle con un descanso no me funcionaba. Si sus tablas son tan grandes, vea si lo siguiente funciona para usted. Es lo que tenía que hacer. En el caso común, cuando tiene muchas marcas de tiempo durante un solo paso del proceso, ahorrará MUCHO tiempo. Esto es por 2 razones: primero, no hay comparaciones. En segundo lugar, solo itera una vez para cada paso del proceso, configurando las filas de la tabla en valores de forma masiva. Para ello, concatena los datos de la marca de tiempo de la receta directamente en la tabla original, trabaja con los dos juntos y luego elimina los datos de la receta.
Names Default To Here( 1 );
//sample data table
dt1 = As Table( (1 :: 30)` || J( 30, 1, Random Uniform() ), <<COLUMN names=""></COLUMN>
Si ves esto, cuéntame cómo te va.
Salud,
Brady
Re: ¿La forma más eficiente de agregar información a las filas haciendo coincidir la marca de tiempo de dos tablas de datos?Hola Brady, muchas gracias por el código.
El código pierde una parte para hacer el trabajo por completo. Asigna el número de orden de compra y el ID de receta correctos desde el comienzo de la ejecución, pero no se detiene cuando finaliza la orden de compra... lo que significa que la ID de receta y la orden de compra continúan colocándose en filas hasta el comienzo de la siguiente orden de compra, por lo tanto una especie de "sobrepaso".
Tengo miles de filas en mi tabla de datos, pero digamos que hubo 10 períodos de tiempo desde el comienzo de un PO hasta el siguiente, pero el primer PO pasó del período de tiempo 1 al 7, me gustaría que los períodos 8 y 9 fueran " vacío", por lo tanto, se eliminó porque no había producción en ese momento, y luego continuar desde el período de tiempo 10 con la siguiente orden de compra.
Espero que la explicación tenga sentido.
¿La forma más eficiente de agregar información a las filas haciendo coincidir la marca de tiempo de dos tablas de datos?Extraje datos de Historian a intervalos de 5 segundos durante un largo período de tiempo, y terminé con una tabla de datos de muchas filas. Inicialmente, en esta tabla de datos tenía dos columnas (llame a esta tabla "2205 - 2209 PD3102" y la mencioné como dtPDTag):
1. Sello de fecha/hora
2. Valor de datos (para la etiqueta Historian)
En una tabla de datos diferente (dt en la siguiente sintaxis JSL) tenía la hora de inicio y finalización de las producciones para las que tenía el identificador de PO y el símbolo de receta. (Así que cuatro columnas: 1. Fecha/hora de inicio, 2. Fecha/hora de finalización, 3. Número de orden de compra, 4. Símbolo de receta.)
En dtPDTag, agregué dos columnas, orden de compra y símbolo, en las que quería agregar el número de orden de compra y el símbolo de la receta (según la marca de fecha/hora).El código JSL que utilicé para realizar esta tarea se encuentra a continuación, pero supongo que esta es una forma bastante ineficiente de administrar esta tarea.(¡Mi computadora no pareció responder muy bien a la demanda que se le impuso!) Sería genial escuchar formas mejores / más efectivas de abordar tal tarea en el futuro.
Por "más eficiente" me refiero a un método de secuencias de comandos más efectivo que la combinación de dos bucles for y la condición "si" que se ve en mi JSL a continuación.
Names Default To Here(1);
dt = Current Data Table();
nr = N Rows(dt); // show(nr);
lstPO = dt:PO << Get Values;
lstSymbol = dt:Symbol << Get Values;
lstStartTime = dt:StartTime << Get Values;
lstEndTime = dt:EndTime << Get Values; // show(lstPO,lstSymbol,lstStartTime,lstEndTime);
dtPDTag = data Table( "2205 - 2209 PD3102" );
nrPD = N Rows(dtPDTag); // show(nrPD);
For(j=1,j<=nr,j++,
_start = lstStartTime[j]; _end = lstEndTime[j]; // show(_start,_end);
_PO =lstPO[j]; _symbol = lstSymbol[j];
For(i=1,i<=nrPD,i++,
If( ( dtPDTag:DateTime[i] > lstStartTime[j] ) & ( dtPDTag:DateTime[i] < lstEndTime[j] ),
dtPDTag:PO[i] = lstPO[j];
dtPDTag:Symbol[i] = lstSymbol[j];
,
);
);
);
Automatización y secuencias de comandosLa personalización en masa