Re : Le moyen le plus efficace d'ajouter des informations aux lignes en faisant correspondre l'horodatage de deux tables de donnéesIl existe de nombreuses options pour le faire (en particulier avec les scripts).Vous pourrez peut-être créer une requête SQL à l'aide de JMP Query Builder dans le menu Tables (vous pouvez utiliser des tables de données avec celui-ci) dans lequel vous pouvez définir les plages et la façon dont les lignes doivent être jointes.
Re : Le moyen le plus efficace d'ajouter des informations aux lignes en faisant correspondre l'horodatage de deux tables de données ?Voici ma démarche.Si les données sont triées, elles peuvent être transmises une fois et les valeurs nécessaires peuvent être trouvées.Jetez un œil à la JSL ci-dessous pour l'approche générale à adopter.Le code n'est pas testé, je n'ai pas de tables de données pour le tester.Cependant, j'ai utilisé cette approche plusieurs fois auparavant, et c'est une approche efficace.Mais préparez-vous à l'ajuster un peu.
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 : Le moyen le plus efficace d'ajouter des informations aux lignes en faisant correspondre l'horodatage de deux tables de données ?Merci Jim. Pour vérifier l'interprétation par rapport à mon code pas si efficace:
- Vous introduisez PDStart comme un compteur pour éviter de parcourir encore et encore des lignes qui ont déjà fait l'objet d'une réponse
- Vous incluez Break(); quitter la boucle le plus tôt possible pour le faire
Bref, avec ces deux ajouts vous éliminez la redondance qui était inhérente à mon code ?
Re : Le moyen le plus efficace d'ajouter des informations aux lignes en faisant correspondre l'horodatage de deux tables de données ?Correct!
Re : Le moyen le plus efficace d'ajouter des informations aux lignes en faisant correspondre l'horodatage de deux tables de données ?Salut,
Je me rends compte que je suis en retard pour cela. J'ai décidé de répondre car j'avais un besoin similaire lorsque je travaillais en semi, et ma table de données était si volumineuse que même une seule boucle avec une pause ne fonctionnait pas pour moi. Si vos tables sont aussi grandes, voyez si ce qui suit vous convient. C'est ce que j'avais à faire. Dans le cas courant, lorsque vous avez de nombreux horodatages au cours d'une seule étape de processus, cela vous fera gagner BEAUCOUP de temps. C'est pour 2 raisons : premièrement, il n'y a pas de comparaisons. Deuxièmement, il n'itère qu'une seule fois pour chaque étape du processus, définissant les lignes du tableau sur des valeurs en masse. Il le fait en concaténant les données d'horodatage de la recette directement sur la table d'origine, en travaillant avec les deux ensemble, puis en supprimant les données de la recette.
Names Default To Here( 1 );
//sample data table
dt1 = As Table( (1 :: 30)` || J( 30, 1, Random Uniform() ), <<COLUMN names=""></COLUMN>
Si vous voyez cela, faites-moi savoir comment ça se passe.
Acclamations,
brady
Re : Le moyen le plus efficace d'ajouter des informations aux lignes en faisant correspondre l'horodatage de deux tables de données ?Salut Brady, merci beaucoup pour le code.
Le code manque une partie pour faire le travail entièrement. Il alloue le bon numéro de bon de commande et l'ID de recette dès le début de l'exécution, mais il ne s'arrête pas lorsque le bon de commande est terminé ... ce qui signifie que l'ID de recette et le bon de commande continuent d'être mis en rangées jusqu'au début du prochain bon de commande, d'où une sorte de "dépassement".
J'ai des milliers de lignes dans ma table de données, mais disons qu'il y avait 10 périodes entre le début d'un bon de commande et le suivant, mais que le premier bon de commande est passé de la période 1 à 7, je voudrais que les périodes 8 et 9 soient " vide", donc supprimé car il n'y avait pas de production à ce moment-là, puis continuer à partir de la période 10 avec le bon de commande suivant.
J'espère que l'explication a du sens.
Le moyen le plus efficace d'ajouter des informations aux lignes en faisant correspondre l'horodatage de deux tables de données ?J'ai extrait les données de l'historique à 5 secondes d'intervalle sur une longue période, pour me retrouver avec une table de données de plusieurs lignes. Initialement, dans cette table de données, j'avais deux colonnes (appelez cette table "2205 - 2209 PD3102" et je l'ai référencée comme dtPDTag):
1. Horodatage
2. Valeur de données (pour la balise Historian)
Dans une table de données différente (dt dans la syntaxe JSL ci-dessous), j'avais l'heure de début et de fin des productions pour lesquelles j'avais l'identifiant du bon de commande et le symbole de la recette. (Donc quatre colonnes : 1. Date/heure de début, 2. Date/heure de fin, 3. Numéro de bon de commande, 4. Symbole de la recette.)
Dans dtPDTag, j'ai ajouté deux colonnes - PO et Symbole - dans lesquelles je voulais ajouter le numéro de bon de commande et le symbole de la recette (basé sur l'horodatage).Le code JSL que j'ai utilisé pour accomplir cette tâche est ci-dessous, mais je suppose que c'est une façon assez inefficace de gérer cette tâche.(Mon ordinateur ne semble pas répondre trop sainement à la demande qui lui est faite !) Ce serait formidable d'entendre des moyens meilleurs / plus efficaces d'aborder une telle tâche à l'avenir.
Par "la plus efficace", je fais référence à une méthode de script plus efficace que la combinaison de deux boucles for et de la condition "if" vue dans mon JSL ci-dessous.
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];
,
);
);
);
Automatisation et scriptPersonnalisation de masse