Ri: Il modo più efficiente per aggiungere informazioni alle righe abbinando il timestamp di due tabelle di datiCi sono alcune opzioni per farlo (specialmente con lo scripting).Potresti essere in grado di creare una query SQL utilizzando JMP Query Builder nel menu Tabelle (puoi utilizzare tabelle di dati con esso) in cui puoi definire gli intervalli e il modo in cui le righe devono essere unite.
Ri: Il modo più efficiente per aggiungere informazioni alle righe abbinando il timestamp da due tabelle di dati?Ecco il mio approccio.Se i dati sono ordinati, possono essere passati una volta e si possono trovare i valori necessari.Dai un'occhiata al JSL qui sotto per l'approccio generale da adottare.Il codice non è testato, non ho tabelle di dati per testarlo.Tuttavia, ho già utilizzato questo approccio molte volte ed è un approccio efficiente.Ma preparati a modificarlo un po '.
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_ );
Ri: Il modo più efficiente per aggiungere informazioni alle righe abbinando il timestamp da due tabelle di dati?Grazie Jim. Per verificare l'interpretazione rispetto al mio codice non così efficiente:
- Introduci PDStart come contatore per evitare di passare attraverso le righe più e più volte a cui è già stata già data risposta
- Includete Break(); lasciare il ciclo il prima possibile per farlo
Insomma, con queste due aggiunte elimini la ridondanza che era insita nel mio codice?
Ri: Il modo più efficiente per aggiungere informazioni alle righe abbinando il timestamp da due tabelle di dati?Corretto!
Ri: Il modo più efficiente per aggiungere informazioni alle righe abbinando il timestamp da due tabelle di dati?CIAO,
Mi rendo conto di essere in ritardo per questo. Ho deciso di rispondere perché avevo un'esigenza simile quando lavoravo in semi e la mia tabella di dati era così grande che anche un singolo ciclo con un'interruzione non funzionava per me. Se le tue tabelle sono così grandi, verifica se quanto segue funziona per te. È quello che dovevo fare. Nel caso comune, quando hai molti timestamp durante una singola fase del processo, risparmierai MOLTO tempo. Questo per 2 motivi: primo, non ci sono paragoni. In secondo luogo, itera solo una volta per ogni fase del processo, impostando le righe della tabella sui valori in blocco. Lo fa concatenando i dati del timestamp della ricetta direttamente sulla tabella originale, lavorando con i due insieme e quindi rimuovendo i dati della ricetta.
Names Default To Here( 1 );
//sample data table
dt1 = As Table( (1 :: 30)` || J( 30, 1, Random Uniform() ), <<COLUMN names=""></COLUMN>
Se ti capita di vederlo, fammi sapere come va.
Saluti,
Brady
Ri: Il modo più efficiente per aggiungere informazioni alle righe abbinando il timestamp da due tabelle di dati?Ciao Brady, molte grazie per il codice.
Il codice manca di una parte per svolgere completamente il lavoro. Assegna il numero dell'ordine di acquisto e l'ID della ricetta corretti dall'inizio dell'esecuzione, ma non si interrompe quando l'ordine di acquisto è terminato ... il che significa che l'ID della ricetta e l'ordine di acquisto continuano a essere inseriti in righe fino all'inizio del successivo ordine di acquisto, quindi una sorta di "superamento".
Ho migliaia di righe nella mia tabella di dati, ma diciamo che ci sono stati 10 periodi di tempo dall'inizio di un ordine di acquisto fino al successivo, ma il primo ordine di acquisto è passato dal periodo di tempo 1 al 7, vorrei che i periodi 8 e 9 fossero " vuoto", quindi soppresso perché in quel momento non c'era produzione, per poi proseguire dalla fascia oraria 10 con il PO successivo.
Spero che la spiegazione abbia un senso.
Il modo più efficiente per aggiungere informazioni alle righe abbinando il timestamp di due tabelle di dati?Ho estratto i dati Historian a intervalli di 5 secondi per un lungo periodo di tempo, finendo con una tabella di dati di molte molte righe. Inizialmente in questa tabella dati avevo due colonne (chiamate questa tabella "2205 - 2209 PD3102" e vi ho fatto riferimento come dtPDTag):
1. Data/ora
2. Valore dati (per il tag Historian)
In una tabella di dati diversa (dt nella sintassi JSL sottostante) avevo l'ora di inizio e di fine delle produzioni per le quali avevo l'identificatore PO e il simbolo della ricetta. (Quindi quattro colonne: 1. Data/ora di inizio, 2. Data/ora di fine, 3. numero dell'ordine di acquisto, 4. Simbolo della ricetta.)
In dtPDTag ho aggiunto due colonne - PO e Simbolo - in cui volevo aggiungere il numero dell'ordine d'acquisto e il simbolo della ricetta (in base alla data/ora).Il codice JSL che ho usato per svolgere questa attività è riportato di seguito, ma presumo che questo sia un modo piuttosto inefficiente per gestire questa attività.(Il mio computer non sembra rispondere in modo troppo salutare alla domanda posta su di esso!) Sarebbe bello sapere di modi migliori / più efficaci per affrontare un simile compito in futuro.
Con "più efficiente" mi riferisco a un metodo di scripting più efficace rispetto alla combinazione di due cicli for e l'unica condizione "if" vista nel mio JSL di seguito.
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];
,
);
);
);
Automazione e scriptingPersonalizzazione di massa