Re: 2 つのデータ テーブルのタイム スタンプを一致させて行に情報を追加する最も効率的な方法これを行うにはかなりの数のオプションがあります (特にスクリプトを使用する場合)。JMP Query Builder の [Tables] メニュー (データ テーブルを使用できます) を使用して、範囲と行の結合方法を定義できる SQL Query を作成できる場合があります。
Re: 2 つのデータ テーブルのタイム スタンプを一致させて行に情報を追加する最も効率的な方法は?これが私のアプローチです。データがソートされている場合、データを 1 回通過させるだけで、必要な値を見つけることができます。一般的なアプローチについては、以下の JSL を参照してください。コードはテストされていません。テストするデータ テーブルがありません。しかし、私はこのアプローチを以前に何度も使用しており、効率的なアプローチです。ただし、少し調整する準備をしてください。
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: 2 つのデータ テーブルのタイム スタンプを一致させて行に情報を追加する最も効率的な方法は?ありがとうジム。 あまり効率的ではないコードと解釈を確認するには:
- PDStart をカウンタとして導入し、すでに対応済みの行を何度も何度も通過しないようにする
- Break(); を含めます。そうするためにできるだけ早くループを離れる
要するに、これら 2 つの追加により、私のコードに固有の冗長性が排除されますか?
Re: 2 つのデータ テーブルのタイム スタンプを一致させて行に情報を追加する最も効率的な方法は?正しい!
Re: 2 つのデータ テーブルのタイム スタンプを一致させて行に情報を追加する最も効率的な方法は?やあ、
私はこれに遅れていることに気づきます。 セミで働いていたときも同様のニーズがあり、データテーブルが大きすぎてブレークを伴う単一のループでさえ機能しなかったため、回答することにしました。 テーブルがそれほど大きい場合は、次の方法でうまくいくかどうかを確認してください。 それは私がしなければならなかったことです。 一般的なケースでは、1 つのプロセス ステップで多くのタイムスタンプがあると、大幅に時間を節約できます。 これには 2 つの理由があります。1 つ目は、比較対象がないことです。 次に、プロセス ステップごとに 1 回だけ反復し、テーブルの行に値を一括で設定します。 これは、レシピのタイムスタンプ データを元のテーブルに直接連結し、2 つを一緒に操作してから、レシピ データを削除することによって行われます。
Names Default To Here( 1 );
//sample data table
dt1 = As Table( (1 :: 30)` || J( 30, 1, Random Uniform() ), <<COLUMN names=""></COLUMN>
たまたまこれを見たら、その様子を教えてください。
乾杯、
ブレイディ
Re: 2 つのデータ テーブルのタイム スタンプを一致させて行に情報を追加する最も効率的な方法は?こんにちはブレイディ、コードをありがとう。
コードには、ジョブを完全に実行するための 1 つの部分が欠けています。 実行の開始から正しい PO 番号とレシピ ID を割り当てますが、PO が終了しても停止しません。つまり、レシピ ID と PO は次の PO の開始まで行に配置され続けます。したがって、 「オーバーラン」の一種。
私のデータ テーブルには数千行ありますが、ある PO の開始から次の PO まで 10 の期間があったとしますが、最初の PO は期間 1 から 7 まででした。期間 8 と 9 を「空」であり、その時点で生産がなかったため削除され、次の PO で期間 10 から続行されます。
説明が理にかなっていることを願っています。
2 つのデータ テーブルのタイムスタンプを照合して行に情報を追加する最も効率的な方法は何ですか?Historian データを 5 秒間隔で長期間にわたって抽出し、最終的に多くの行からなるデータ テーブルになりました。 最初、このデータ テーブルには 2 つの列がありました (このテーブルを「2205 - 2209 PD3102」と呼び、dtPDTag として参照しました)。
1. 日付/時刻スタンプ
2. データ値 (Historian タグの場合)
別のデータ テーブル (以下の JSL 構文の dt) には、PO 識別子とレシピ シンボルが含まれるプロダクションの開始時刻と終了時刻がありました。 (つまり 4 つの列: 1. 開始日時、2. 終了日時、3. PO 番号、4。 レシピ記号。)
dtPDTag では、PO 番号とレシピ シンボル (日付/タイム スタンプに基づく) を追加する 2 つの列 (PO と Symbol) を追加しました。このタスクを実行するために使用した JSL コードを以下に示しますが、これはこのタスクを管理するにはかなり非効率な方法だと思います。(私のコンピューターは、それに課せられた要求に対してあまり健全に反応していないようでした!) 将来、そのようなタスクに取り組むためのより良い/より効果的な方法を聞けると嬉しいです。
「最も効率的」とは、以下の JSL に見られる 2 つの for ループと 1 つの "if" 条件の組み合わせよりも効果的なスクリプト作成方法を指します。
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];
,
);
);
);
自動化とスクリプト作成マスカスタマイゼーション