Salut tout le monde,
J'ai une table de données qui se compose d'entrées datées où l'entrée la plus récente est en haut de la table et l'entrée la plus ancienne est en bas.
Ce que j'essaie de faire, c'est parcourir les lignes pour trouver la différence de date entre deux lignes. Je l'ai fait avec le code suivant, je l'ai obtenu à partir d'un message qui @txnelson répondu il y a quelque temps (désolé de ne pas avoir l'OP devant moi).
dt = Data Table( "My Data" );
For( i=N Rows(dt), i >= 2, i--,
:ct[i] = Abs(DateDifference(:date[i-1], :date[i], "Day"));
);
Cela fonctionne très bien, et je peux trouver toutes les différences de dates intéressantes.
Cependant, ce que je veux vraiment faire, c'est étiqueter les plages de dates avec des lettres de l'alphabet (A, B, C, D, etc.).
Par exemple, si ma première entrée (dernière ligne dans le tableau de données) commence le 01/01/2017 (jj/mm/aaaa), je veux étiqueter cette ligne "A", et je veux continuer à étiqueter les lignes en remontant la colonne jusqu'à ce qu'il atteigne un point où la différence de dates est >=n (dans ce cas n=2, mais peut être n'importe quel nombre supérieur à 1).
Gardez à l'esprit que les dates augmentent à mesure que nous progressons à partir du bas du tableau. Ainsi, la ligne suivante au-dessus serait 02/01/2017. Disons que cela dure jusqu'à fin janvier, il y a donc 31 lignes allant du 01/01/2017 au 31/01/2017.
À la ligne suivante au-dessus du 31/01/2017, nous avons le 05/02/2017. La différence de date est donc de 5. Je voudrais ensuite que mon traceur d'étiquettes commence à l'étiqueter comme "B" jusqu'au prochain changement de date où la différence est> = 2, puis commence à étiqueter comme "C", et ainsi de suite jusqu'à ce que le tableau de données soit terminé.
Quelque chose de proche de cela a également été posté par @txnelson dans ce fil : https://community.jmp.com/t5/Discussions/Labeling-rows-as-greater-less-than-a-date-with-JSL/td-p/36376 , mais il nécessite une date de début spécifiée pour comparer d'autres dates. Je ne veux pas avoir de date de début spécifiée, mais plutôt que cela soit fait automatiquement en fonction des dates qui ont rempli le tableau.
Toute suggestion/soutien est grandement apprécié.
Merci!
@txnelson Merci beaucoup pour votre code. Je l'ai suivi très clairement, c'était bien documenté et logique. Testé sur l'exemple de tableau de données que vous avez créé et cela a très bien fonctionné.
J'ai dû le modifier légèrement pour mon format de données spécifique car il s'agit d'une grande table de données qui est concaténée et parfois la plage de dates revient en boucle, de sorte que la différence de date est très importante (> 100 jours). Néanmoins, il était facile de le modifier car vos commentaires ont beaucoup aidé.
En fait, je commençais à faire quelque chose de très similaire à votre solution, mais j'y arrivais beaucoup plus lentement que vous! Je pense que c'est pourquoi la logique de votre code avait tant de sens.
J'apprécie vraiment l'aide, merci!
Voici un script qui devrait faire ce que vous voulez ...... assurez-vous de l'étudier afin de comprendre comment fonctionnent les différentes fonctions et comment fonctionne la logique du code.En d'autres termes, ne vous contentez pas de le copier-coller sans le comprendre.
Names Default To Here( 1 );
// Create a sample data table
dt = New Table( "Example",
Add Rows( 100 ),
New Column( "Date",
Numeric,
"Continuous",
Format( "ddMonyyyy", 12 ),
Input Format( "ddMonyyyy" ),
Set Values(
[3640106008.56964, 3639892909.24216, 3639816069.76636, 3639711971.2654,
3639614050.02423, 3639594631.39805, 3639581856.84272, 3639499697.65438,
3639405448.76553, 3639293346.42584, 3639022373.8664, 3638682552.62729,
3638662956.28802, 3638644514.74731, 3638510978.46425, 3638508355.329,
3638447240.64829, 3638280760.96257, 3638253465.01226, 3638182573.0004,
3638135159.78165, 3638031154.80142, 3638019646.52908, 3637888422.23898,
3637821622.60523, 3637761224.6898, 3637708154.53698, 3637655683.55496,
3637523013.28917, 3637336766.86203, 3637273948.44657, 3637146868.92602,
3637139130.85435, 3637041997.93449, 3636718392.96078, 3636702006.57404,
3636684337.39444, 3636645617.3044, 3636621923.04457, 3636576772.74921,
3636548097.39841, 3636524282.13857, 3636202501.07711, 3636082870.01646,
3636015305.10949, 3635986264.04419, 3635954006.90437, 3635864908.69012,
3635855262.80858, 3635593939.60592, 3635374128.02522, 3635336114.35042,
3635271204.82971, 3635136811.26229, 3635062537.71875, 3635022035.10663,
3634999736.12185, 3634972464.2373, 3634849211.45924, 3634794399.03536,
3634785984.37775, 3634667869.53241, 3634645627.14123, 3634606120.34103,
3634483420.7033, 3634469476.65781, 3634457506.03348, 3634300180.05399,
3634161262.31866, 3634024215.74686, 3633993153.4734, 3633957176.13649,
3633780205.72602, 3633775930.38711, 3633762315.48745, 3633671471.68225,
3633623618.86685, 3633564003.73824, 3633498484.02555, 3633488261.49554,
3633127296.72145, 3633091315.52892, 3632836504.4496, 3632759089.11,
3632695080.2713, 3632564084.614, 3632496376.27829, 3632409035.04661,
3632213416.86148, 3632155851.6491, 3632136908.29403, 3632061846.54667,
3632011684.6858, 3631978413.53537, 3631925136.87974, 3631865971.06053,
3631774901.06017, 3631755982.44004, 3631706805.99126, 3631667141.16235]
),
Set Display Width( 68 )
)
);
// Create the new column
dt<<NEW column="">= 1, i--,
If( i == N Rows( dt ),
// Last row in the table gets the letter "A"
dt:Label[i] = alphaList[letter],
// Otherwise
// If the date on this row is >= the date on the last row,
// change the letter number
If( Abs( Date Difference( :date[i + 1], :date[i], "Day" ) ) >= 2,
letter = letter + 1
);
// Since there could be more than 26 groups, groups AA, BB etc.
// may have to be added, so calculate the number of letters
howmanyLetters = Floor( Letter / 26 ) + 1;
// Now calculate which letter to use
whichLetter = Modulo( letter, 26 );
If( whichLetter == 0,
whichLetter = 26
);
// Create the new value for the column Label
For( k = 1, k <= howmanyLetters, k++,
dt:Label[i] = dt:Label[i] || alphaList[whichLetter]
);
)
);</NEW>