Utilisation de colonnes hh: mm passant à minuit pour déterminer les temps écoulés.Je pensais que ça allait être un problème simple, et me voici, quelques heures plus tard, pas plus loin. J'ai deux colonnes dans un très grand tableau. L'un est une heure au format hh: mm. L'autre est une série de mesures. Toutes les mesures sont prises sur une période de 24 heures (ou légèrement moins) et le temps enregistré en hh: mm. Ce dont j'ai vraiment besoin, c'est d'un temps écoulé depuis la première mesure. Le problème est que tout est référencé à 00:00 et que les calculs sont donc complètement douteux à ce stade car il ne sait pas que c'est le lendemain et l'ensemble de données est beaucoup trop volumineux pour que j'ajoute le jour manuellement. Toutes les pensées sont grandement appréciées!
L'autre chose étrange que j'ai trouvée est que le fichier de données s'est comporté de manière très différente selon que j'ai importé le fichier Excel ou enregistré le fichier Excel en tant que fichier .txt et que je l'ai importé. Ce dernier était bien meilleur.
Re: Travailler avec des colonnes hh: mm qui passent à minuit pour déterminer les temps écoulés.1. La colonne de temps est-elle une colonne de caractères ou une colonne de temps JMP?
2. La détection de la valeur de l'heure des lignes en cours étant inférieure à la valeur des lignes précédentes serait-elle un indicateur d'un incrément dans la date?Re: Travailler avec des colonnes hh: mm qui passent à minuit pour déterminer les temps écoulés. @txnelson Merci beaucoup.
La colonne est un JMP numérique continu formaté au format JMP hh: mm. Je l'ai également converti en personnage pour voir si cela a aidé (ça n'a pas aidé).
J'ai essayé de trier la colonne de telle sorte qu'elle commence par exemple. 00:00. Et ça marche. Mais malheureusement, une mesure à 16h00 (jour 1) sera juste à côté de 16h10 (prise le jour 2).
J'ai essayé la commande Lag dans l'éditeur de formule qui avait l'air bien mais encore une fois que vous avez franchi ce seuil de 00h00, c'est devenu un peu fou. Ensuite, j'ai commencé à construire des instructions if / then dans la formule sur lesquelles je reviendrai alors que je me réchauffais. Mais je n'ai pas pensé à utiliser les instructions if / then pour basculer les données comme vous le suggérez. Et il était alors 3 heures du matin et j'ai pensé qu'il était temps de se coucher.
Merci beaucoup pour vos pensées.
Meilleur,
Greg
Re: Travailler avec des colonnes hh: mm qui passent à minuit pour déterminer les temps écoulés.Je viens de créer un exemple de tableau qui, espérons-le, montre mieux le problème que ma description.
Re: Travailler avec des colonnes hh: mm qui passent à minuit pour déterminer les temps écoulés.Voici le mieux que je puisse faire, sans valeur de jour exacte. Le JSL ci-dessous fait l'hypothèse qu'un nouveau jour a commencé si la valeur de ligne précédente pour la colonne Time est inférieure à la valeur actuelle de la colonne Time. Vous avez indiqué dans une réponse précédente que ce n'était peut-être pas le cas. Mais, sans valeur Day exacte, c'est le mieux que je pense qui puisse être fait. J'ai également joint votre tableau de données avec la nouvelle colonne de formule attachée. Voici la formule proposée
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;
Re: Travailler avec des colonnes hh: mm qui passent à minuit pour déterminer les temps écoulés.Merci encore @txnelson . Très appréciée!
Re: Travailler avec des colonnes hh: mm qui passent à minuit pour déterminer les temps écoulés.@txnelson,
I looked for an alternate solution, because I thought your function in a large table might be slow. My approach is to use dif and lag functions to create column :cum cumulative time. In otherwords get incremental time changes then sum them up.
I think there is an error in your function, but I am not sure where. I converted the table to duration format.

Here is the formula for :dif
If( :Time < Lag( :Time, 1 ),
(:Time + 24 * 60 * 60) - Lag( :Time, 1 ),
Dif( :Time, 1 )
)
Here is the formula for :cum
Sum(Lag(:cum, 1), :Diff)
This assumes there is less than 24 hrs between events.
Jim, I think you need In Days(dayCounter -1) in your formula, since you counted 1 day for your starttime.
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
);
)
Re: Travailler avec des colonnes hh: mm qui passent à minuit pour déterminer les temps écoulés.Bonne prise.
Re: Travailler avec des colonnes hh: mm qui passent à minuit pour déterminer les temps écoulés.Cela n'était peut-être pas nécessaire, mais c'était amusant et j'ai donc pu utiliser Parallel 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>Re: Travailler avec des colonnes hh: mm qui passent à minuit pour déterminer les temps écoulés.cool