回复:通過匹配兩個數據表中的時間戳向行添加信息的最有效方法有很多選項可以做到這一點(尤其是使用腳本)。您可以使用表菜單下的 JMP 查詢生成器(您可以使用數據表)構建 SQL 查詢,您可以在其中定義範圍和行的連接方式。
回复:通過匹配兩個數據表中的時間戳向行添加信息的最有效方法?這是我的方法。如果數據是經過排序的,那麼可以將它們傳一遍,就可以找到需要的值。請查看下面的 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_ );
回复:通過匹配兩個數據表中的時間戳向行添加信息的最有效方法?謝謝吉姆。 檢查解釋與我不太有效的代碼:
- 您引入 PDStart 作為計數器,以避免一次又一次地遍歷已經響應的行
- 你包括 Break();盡快離開循環
簡而言之,通過這兩項添加,您消除了我的代碼固有的冗餘?
回复:通過匹配兩個數據表中的時間戳向行添加信息的最有效方法?正確的!
回复:通過匹配兩個數據表中的時間戳向行添加信息的最有效方法?你好,
我意識到我來晚了。 我決定響應,因為我在 semi 工作時也有類似的需求,而且我的數據表非常大,以至於即使是帶有 break 的單個循環對我來說也不起作用。 如果您的表那麼大,請查看以下內容是否適合您。 這是我必須做的。 在常見情況下,當您在單個流程步驟中有多個時間戳時,它會節省很多時間。 這有兩個原因:首先,沒有比較。 其次,它只為每個流程步驟迭代一次,將表格行批量設置為值。 它通過將食譜時間戳數據直接連接到原始表上,將兩者一起使用,然後刪除食譜數據來實現這一點。
Names Default To Here( 1 );
//sample data table
dt1 = As Table( (1 :: 30)` || J( 30, 1, Random Uniform() ), <<COLUMN names=""></COLUMN>
如果你碰巧看到這個,讓我知道它是怎麼回事。
乾杯,
布雷迪
回复:通過匹配兩個數據表中的時間戳向行添加信息的最有效方法?嗨布雷迪,非常感謝代碼。
代碼遺漏了一個部分來完成這項工作。 它從運行開始就分配正確的 PO 編號和配方 ID,但是當 PO 結束時它不會停止……這意味著配方 ID 和 PO 繼續排成行,直到下一個 PO 開始,因此一種“超車”。
我的數據表中有數千行,但假設從一個 PO 開始到下一個 PO 有 10 個時間段,但第一個 PO 從時間段 1 到 7,我希望時間段 8 和 9 是“ empty”,因此被刪除,因為當時沒有生產,然後從時間段 10 繼續下一個 PO。
希望解釋是有道理的。
通過匹配兩個數據表中的時間戳來向行添加信息的最有效方法?我在很長一段時間內以 5 秒的間隔提取 Historian 數據,最終得到一個包含許多行的數據表。 最初,在此數據表中,我有兩列(將此表稱為“2205 - 2209 PD3102”,我將其稱為 dtPDTag):
1. 日期/時間戳
2. 數據值(對於Historian標籤)
在不同的數據表(下面的 JSL 語法中的 dt)中,我有生產的開始和結束時間,我有 PO 標識符和配方符號。 (所以四列:1. 開始日期/時間,2. 結束日期/時間,3. 採購訂單號,4。 食譜符號。)
在 dtPDTag 中,我添加了兩列 - PO 和符號 - 我想在其中添加 PO 編號和配方符號(基於日期/時間戳)。下面是我用來完成此任務的 JSL 代碼,但我認為這是管理此任務的一種非常低效的方法。(我的計算機似乎對對其提出的要求的反應不太健康!)很高興聽到將來有更好/更有效的方法來完成此類任務。
我所說的“最有效”是指一種比下面我的 JSL 中看到的兩個 for 循環和一個“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];
,
);
);
);
自動化和腳本編寫大規模定制