使用经过午夜的 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. 当前行时间值小于前一行值的检测是否表明日期增加?