使用經過午夜的 hh:mm 列來確定經過的時間。我認為這將是一個簡單的問題,幾個小時後我就到了。 我在非常大的表中有兩列。 一種是格式 hh:mm 的時間。 另一種是一系列測量。 所有測量均在 24 小時內(或略短)進行,時間記錄為 hh:mm。 我真正需要的是從第一次測量開始的經過時間。 問題是所有內容都引用到 00:00,因此計算在這一點上變得很奇怪,因為它不知道第二天是第二天,而且數據集太大,我無法手動添加日期。 任何和所有的想法都將不勝感激!
我發現的另一件奇怪的事情是,數據文件的行為完全不同,具體取決於我是導入 Excel 文件,還是將 Excel 文件保存為 .txt 文件並導入它。 後者要好得多。
回复:使用通過午夜的 hh:mm 列來確定經過的時間。涼爽的
回复:使用通過午夜的 hh:mm 列來確定經過的時間。這可能是不必要的,但它很有趣,所以我必須使用並行分配()。
Names default to here(1);
dt = current data table();
t = dt:Time << Get Values();
n = nitems(t);
diff = t[2::n]-t[1::(n-1)];
day_break = loc(diff<0); // this will give you last row of the day
// make a matrix n x number of day breaks
m = J(n, nitems(day_break), -1);
parallel assign({db = day_break},
// make the item a 1 if it's row is higher than the corresponding row
m[a, b] = a > db[b];
);
m;
// now just sum the matrix
day = VSum(m`); // +1; // if you want the day to start at 1
dt << New Column("Day", ordinal, <<SET values=""></SET>回复:使用通過午夜的 hh:mm 列來確定經過的時間。接得好。
回复:使用通過午夜的 hh:mm 列來確定經過的時間。@txnelson ,
我尋找了另一種解決方案,因為我認為您在大表中的功能可能很慢。我的方法是使用 dif 和 lag 函數來創建列:暨累計時間。 換句話說,獲得增量時間變化然後總結它們。
我認為你的函數有錯誤,但我不確定在哪裡。 我將表格轉換為持續時間格式。

這是公式:差異
If( :Time < Lag( :Time, 1 ),
(:Time + 24 * 60 * 60) - Lag( :Time, 1 ),
Dif( :Time, 1 )
)
這是公式:暨
Sum(Lag(:cum, 1), :Diff)
這假設事件之間的時間少於 24 小時。
吉姆,我認為您的公式中需要 In Days(dayCounter -1),因為您的開始時間為 1 天。
If( Row() == 1,
dayCounter = 0;
startTime = :Time;
newElapsedtime = 0;
,
If( :Time < Lag( :Time ),
dayCounter
++);
If( dayCounter == 0,
newElapsedtime = :Time - startTime,
newElapsedtime = (In Days( 1 ) - startTime) + In Days( dayCounter - 1 ) +
:Time
);
)
回复:使用通過午夜的 hh:mm 列來確定經過的時間。再次感謝@txnelson . 非常感激!
回复:使用通過午夜的 hh:mm 列來確定經過的時間。這是我能做的最好的事情,沒有確切的 Day 值。下面的 JSL 假設如果 Time 列的前一行值小於 Time 列的當前值,則新的一天已經開始。您在之前的回復中表示,情況可能並非如此。但是,如果沒有確切的 Day 值,這是我認為可以做到的最好的。我還附上了您的數據表,並附上了新的公式列。這是建議的公式
If( Row() == 1,
dayCounter = 0;
startTime = :Time;
newElapsedtime = 0;
,
If( :Time < Lag( :Time ),
dayCounter
++);
If( dayCounter == 0,
newElapsedtime = :Time - startTime,
newElapsedtime = (In Days( 1 ) - startTime) + In Days( dayCounter ) + :Time
);
);
newElapsedtime;
回复:使用通過午夜的 hh:mm 列來確定經過的時間。我剛剛製作了一個示例表,希望能比我的描述更好地顯示問題。
回复:使用通過午夜的 hh:mm 列來確定經過的時間。@txnelson非常感謝。
該列是採用 JMP hh:mm 格式的 JMP 數字連續格式。 我還將它轉換為字符,看看是否有幫助(它沒有)。
我嘗試對列進行排序,使其從例如開始。 00:00。 那行得通。 但不幸的是,16:00(第 1 天)的測量將緊鄰 16:10(在第 2 天進行)。
我確實在公式編輯器中嘗試了 Lag 命令,它看起來不錯,但是一旦你越過 00:00 閾值,它就會變得有點瘋狂。 然後我開始在公式中構建一些 if/then 語句,當我在那裡變得溫暖時,我將返回這些語句。 但是我沒有想到按照您的建議使用 if/then 語句以某種方式切換數據。 到那時已經是凌晨 3 點了,我想是時候去睡覺了。
非常感謝您的想法。
最好的,
格雷格
回复:使用通過午夜的 hh:mm 列來確定經過的時間。1.時間列是字符列,還是JMP時間列?
2. 當前行時間值小於前一行值的檢測是否表明日期增加?