真夜中を通過するhh:mm列を処理して、経過時間を判別します。これは簡単な問題だと思っていましたが、数時間後には先に進みます。非常に大きなテーブルに2つの列があります。1つは、hh:mm形式の時刻です。もう1つは、一連の測定です。すべての測定は24時間(またはわずかに短い時間)にわたって行われ、時間はhh:mmとして記録されます。本当に必要なのは、最初の測定からの経過時間です。問題は、すべてが00:00を参照しているため、その日は次の日であることがわからず、データセットが大きすぎて手動で日を追加できないため、その時点で計算がすべておかしくなります。ありとあらゆる考えに感謝します!
私が見つけた他の奇妙なことは、Excelファイルをインポートしたか、Excelファイルを.txtファイルとして保存してインポートしたかによって、データファイルの動作がまったく異なることでした。後者ははるかに優れていました。
日時:深夜を通過するhh:mm列を操作して、経過時間を判別します。1。時間列は文字列ですか、JMP時間列ですか?
2。現在の行の時間値が前の行の値よりも小さいことを検出することは、日付の増分の指標になりますか?日時:深夜を通過するhh:mm列を操作して、経過時間を判別します。しゅうどうもありがとう。
列は、JMP hh:mm形式でフォーマットされたJMP数値連続です。また、文字に変換して、それが役立ったかどうかを確認しました(役に立たなかった)。
例えばで始まるように列をソートしようとしました。00:00。そしてそれは動作します。ただし、残念ながら、16:00(1日目)の測定は16:10(2日目)のすぐ後になります。
フォーミュラエディタでLagコマンドを試しましたが、見栄えは良かったのですが、00:00のしきい値を超えると再びクレイジーになります。それから、数式でif / thenステートメントをいくつか構築し始めました。そこで、暖かくなったときに戻ります。しかし、あなたが提案するようにif / thenステートメントを使用して何らかの方法でデータを切り替えることは考えていませんでした。そして、それまでに午前3時で、寝る時間だと思いました。
ご静聴ありがとうございました。
ベスト、
グレッグ
日時:深夜を通過するhh:mm列を操作して、経過時間を判別します。説明よりも問題をよく示すサンプルテーブルを作成しました。
日時:深夜を通過する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列を操作して、経過時間を判別します。しゅう 、
大きなテーブルでの関数が遅いと思ったため、別の解決策を探しました。 私のアプローチは、difおよびlag関数を使用して列を作成することです: ごっくん累積時間。つまり、時間の増分変更を取得し、それらを合計します。
関数にエラーがあると思いますが、どこにあるのかわかりません。テーブルを期間形式に変換しました。

以下が式です :dif
If( :Time < Lag( :Time, 1 ),
(:Time + 24 * 60 * 60) - Lag( :Time, 1 ),
Dif( :Time, 1 )
)
以下が式です :ごっくん
Sum(Lag(:cum, 1), :Diff)
これは、イベント間の時間が24時間未満であることを前提としています。
ジム、開始時間に1日をカウントしたため、式にIn Days(dayCounter -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列を操作して、経過時間を判別します。良いキャッチ。
日時:深夜を通過するhh:mm列を操作して、経過時間を判別します。これは不要かもしれませんが、面白かったので、パラレルassign()を使用しました。
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列を操作して、経過時間を判別します。涼しい