こんにちは、みんな、
最新のエントリがテーブルの一番上にあり、最も古いエントリが一番下にある日付付きエントリで構成されるデータテーブルがあります。
私がやろうとしているのは、2行間の日付の違いを見つけるために行をループ処理することです。私は次のコードでこれを行いました。 @txnelson 少し前に答えました(申し訳ありませんが、OPが私の目の前にありません)。
dt = Data Table( "My Data" );
For( i=N Rows(dt), i >= 2, i--,
:ct[i] = Abs(DateDifference(:date[i-1], :date[i], "Day"));
);
これは素晴らしい仕事です、そして私は興味のあるすべての日付の違いを見つけることができます。
しかし、私が本当にやりたいのは、日付範囲にアルファベット文字(A、B、C、Dなど)を付けることです。
たとえば、最初のエントリ(データテーブルの最後の行)が2017/01/01(dd / mm / yyyy)に始まっている場合、その行に "A"というラベルを付け、列の上の行にラベルを付けたいとします。日付の差が> = nになるまで(この場合はn = 2ですが、1より大きい任意の数になります)。
表の下から作業を進めていくと、日付が増えていくことに注意してください。したがって、上記の次の行は2017/01/02になります。これが1月末まで続くとすると、2017年1月1日から2017年1月31日までの31行になります。
2017/01/31の上の次の行に、2017/05/02があります。そのため、日付の差は5です。次に、ラベルトラッカーに、差が2以上になる次の日付の変更まで "B"としてラベル付けを開始し、次に "C"としてラベル付けを開始し、データテーブルが終了するまで同様にラベル付けを開始します。
これに近い何かがまた投稿されました @txnelson このスレッドで: https://community.jmp.com/t5/Discussions/Labeling-rows-as-greater-less-than-a-date-with-JSL/td-p/36376 ただし、他の日付と比較するには指定された開始日が必要です。開始日を指定したくはありませんが、テーブルに入力された日付に基づいて自動的に開始日を設定します。
任意の提案/サポートは大歓迎です。
ありがとうございます。
@txnelson あなたのコードをありがとうございました。私はそれを非常に明確にフォローしました、それはよく文書化されていて意味がありました。あなたが作成したサンプルデータテーブルでそれをテストして、それはとてもうまくいった。
それは連結された大きなデータテーブルなので時々日付範囲がループバックするので、私の特定のデータフォーマットのためにそれをわずかに修正しなければなりませんでした。それでも、あなたのコメントが大いに役立ったので、修正するのは簡単でした。
私は実際にあなたの解決策が何であるかと非常によく似たことをし始めていました、しかしあなたがしたよりはるかに遅くそこに着いていました!それがあなたのコードのロジックがとても理にかなっている理由だと思います。
本当にありがとうございました。
ここにあなたが望むことをするべきであるスクリプトがあります......あなたがそれを研究することを確実にするのであなたは異なる機能がどのように働くか、そしてコードの論理がどのように働くか理解するように。 言い換えれば、理解せずに切り取って貼り付けるだけではいけません。
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>