안녕 모두,
가장 최근 항목이 테이블 맨 위에 있고 가장 오래된 항목이 맨 아래에있는 날짜 항목으로 구성된 데이터 테이블이 있습니다.
내가 뭘하려고하는지 두 행 사이의 날짜 차이를 찾기 위해 행을 통해 루프입니다. 나는 다음 코드로 이것을 수행했다. @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 등)로 날짜 범위를 표시하는 것입니다.
예를 들어, 내 첫 번째 항목 (데이터 표의 마지막 행)이 2011 년 1 월 1 일 (dd / mm / yyyy)에 시작되면 해당 행의 레이블을 "A"로 지정하고 행 위로 레이블을 계속 지정하려고합니다 날짜의 차이가> = n 인 지점에 도달 할 때까지 (이 경우 n = 2이지만 1보다 큰 임의의 숫자 일 수 있음).
우리가 테이블의 맨 아래에서 일하면서 날짜가 증가하고 있음을 명심하십시오. 따라서 위의 다음 행은 2011 년 2 월 1 일입니다. 이것이 1 월 말까지 계속된다고 가정 해 봅시다. 따라서 2011 년 1 월 1 일부터 31/01/2017까지 31 개의 행이 있습니다.
2011 년 3 월 31 일의 다음 행에 2011 년 5 월 2 일에 17 일이 있습니다. 그래서 날짜 차이는 5입니다. 그런 다음 차이가> 2 인 다음 날짜로 변경 될 때까지 내 레이블 추적기에서 레이블을 "B"로 시작한 다음 데이터 테이블이 완료 될 때까지 "C"로 레이블 지정을 시작합니다.
이것에 가까운 뭔가가 @txnelson 이 스레드에서 : https://community.jmp.com/t5/Discussions/Labeling-rows-as-greaterless-than-a-date-with-JSL/td-p/36376 다른 날짜를 비교하려면 지정된 시작 날짜가 필요합니다. 나는 지정된 시작 날짜를 갖고 싶지는 않지만 오히려 날짜가 테이블에 채워진 날짜를 기준으로 자동으로 수행해야합니다.
어떤 제안 / 지원도 크게 환영합니다.
감사!
@txnelson 귀하의 코드에 대해 대단히 감사합니다. 나는 그것을 아주 분명히 따라 갔다. 그것은 잘 문서화되고 의미가있다. 작성한 샘플 데이터 테이블에서 테스트 해 보았습니다.
연결된 특정 데이터 형식을 약간 수정해야했기 때문에 큰 데이터 표가 연결되어 있고 날짜 범위가 반복되어 날짜 차이가 너무 커 (> 100 일) 경우가 있습니다. 그럼에도 불구하고, 귀하의 의견을 많이 도왔 수정으로 쉽게했다.
나는 실제로 당신의 솔루션과 비슷한 것을하기 시작했지만, 당신이했던 것보다 훨씬 더 느리게 진행되고있었습니다! 나는 그것이 당신의 코드의 논리가 많은 의미를 갖는 이유라고 생각한다.
정말 고마워요, 고마워요!
여기 당신이 원하는 것을 할 수있는 스크립트가 있습니다 ...... 당신이 그것을 공부하여 다른 기능이 어떻게 작동하는지 그리고 코드의 논리가 어떻게 작동하는지 이해하도록하십시오. 즉, 그것을 이해하지 않고 잘라내어 붙여 넣기 만하면됩니다.
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>