안녕하세요 커뮤니티
다시 한 번 여러분의 도움과 조언이 필요합니다. 새로운 사용자로서 배우기가 어렵습니다.
시작 날짜와 종료 날짜가 포함된 데이터 테이블이 있습니다. 시작일과 종료일 사이의 근무일 수를 계산하고 싶습니다 ?? JMP에서 이를 수행하는 가장 좋은 방법은 무엇입니까 ?? 내 생각은 열을 추가하고 수식(예: 날짜 차이??)을 만드는 것입니다. 하지만 무엇이 더 나은 선택인지 잘 모르겠습니다.
첨부된 예시를 참조하세요

감사해요
남자 이름
안녕 제리
정말 도움이 됐어요. 나는 나만의 목록을 만들었고 이제는 내가 원하는 것이 무엇인지 보여주었습니다.
감사해요
남자 이름
안녕 @마르티네이 ,
나는 두 날짜 열 사이의 근무일 수를 계산하는 추가 기능을 얼마 전에 작성했습니다. 휴일 및 제외하려는 기타 특정 날짜는 추가 기능 디렉터리에 저장된 Holiday List.jmp 파일을 유지 관리하여 처리됩니다. 참고: 이 파일은 JMP 사용자 컴퓨터에서 액세스할 수 있는 모든 위치에 유지되는 모든 문서(Excel, .txt, .csv 등)일 수 있지만, 파일 위치를 제공하려면 기본 JSL을 약간 조정해야 합니다. 그렇지 않으면 귀하가 요청한 요구 사항을 있는 그대로 해결한다고 생각합니다. 휴일 목록 파일을 다운로드, 설치 및 편집하려면 다음 지침을 따르십시오. NETWORKDAYS 기능
도움이 되었기를 바랍니다,
실내 변기
내가 가장 좋아하는 것은 오래된 노스 캐롤라이나입니다. 야구 휴가 .
조금 추가하려면 @Craige_Hales '모래 @Jeff_Perkinson 명절에 대한 생각 등, '현지 공휴일' 회계처리에 대한 생각을 언급하셨습니다. '로컬'에 대한 표준 정의를 채택하지 않으면 이는 정말 어려워집니다. 예를 들어, 캐나다에는 미국과 마찬가지로 '추수감사절' 휴일이 있습니다. 단, 캐나다의 달력상 미국과 다른 날입니다. 그리고 미국의 도시나 주 차원에서 시작하지도 마세요. 예를 들어, 메인 주와 매사추세츠 주에서는 패트리어트 데이(Patriot's Day)가 공휴일이며 미국 다른 곳에서는 기념되지 않습니다. 더욱 끈끈하게 만들기 위해 일부 사업체는 문을 닫고 다른 사업체는 계속 열려 있습니다. 은행 및 금융기관이 포함됩니다.
코딩 작업은 나에게 새로운 일이고 제대로 작동하지 않는 것 같습니다. 그러나 나는 표준 공식 중 일부를 가지고 놀았고 해결책을 찾았습니다. 그러나 근무일만 사용하지 않고 역일을 사용합니다. 이 실험에서는 비교를 위해 동일하므로 충분합니다.
간단한 해결책은 테스트 표현식을 확장하는 것입니다.
// define an expression that answers the question
holidays = associativearray({1jan2020,25dec2020});
includeThisDate = Expr(
(2/*monday*/<= Day Of Week( date ) <= 6/*friday*/)
&
!(holidays<<CONTAINS></CONTAINS>2020년에는 새해와 크리스마스가 평일이므로 262가 아닌 260입니다. 나중에 연관 배열을 업데이트해야 하며 기록 데이터도 필요할 수 있습니다. 일부 공휴일은 매년 같은 날이 아닙니다. 정말 추악한 문제로 인해 ...
복잡한 솔루션은 다음과 같은 것을 사용할 수 있습니다. https://www.abstractapi.com/holidays-api
(크레딧 @Jeff_Perkinson ~을 위한 날짜만 생성하도록 날짜 및 시간 열을 변경합니다.)
네 근무일은 매주 평일입니다. (월~금) 현지 공휴일에도 조정할 수 있으면 좋을 것 같아요
어떤 제안이 있나요?
다른 질문도 있습니다. JMP 날짜에는 항상 시간이 포함되며, 자정 이후 0초로 설정되는 경우가 많습니다. 그러나 범위가 월요일 정오부터 7일 후 월요일 정오까지인 경우 두 개의 월요일 반을 어떻게 계산하시겠습니까? 아니면 월요일이 시작되는 자정이더라도 둘 다 계산해야 합니까?
범위가 작고 너무 많지 않은 경우 일 수를 계산하는 것이 나쁜 선택이 아닐 수 있습니다(잘못 테스트된 코드는 다음과 같습니다).
// define an expression that answers the question
includeThisDate = Expr(
2/*monday*/<= Day Of Week( date ) <= 6/*friday*/
);
// brute force counting:
countSelectedDaysInRange = Function( {firstDate, lastDate, testexpr},
{date, count},
If( lastDate < firstDate,
Throw( "dates reversed" )
);
count = 0;
For( date = firstDate, date <= lastDate, date += In Days( 1 ),
count += (testexpr != 0)
);
count;
);
Show( 262 == countSelectedDaysInRange( 1jan2020, 31dec2020, Name Expr( includeThisDate ) ) );
Show( 104 == countSelectedDaysInRange( 1jan2020, 31dec2020, Expr( !(2/*monday*/<= Day Of Week( date ) <= 6/*friday*/) ) ) );
Show( 366 == countSelectedDaysInRange( 1jan2020, 31dec2020, 1 ) );// 2020 is leap year
Show( 0 == countSelectedDaysInRange( 1jan2020, 31dec2020, 0 ) );// no days counted262 == countSelectedDaysInRange(2020년 1월 1일, 2020년 12월 31일, 이름 Expr(includeThisDate)) = 1;
104 == countSelectedDaysInRange(2020년 1월 1일, 2020년 12월 31일, Expr(!(2 <= 요일(날짜) <= 6))) = 1;
366 == countSelectedDaysInRange(2020년 1월 1일, 2020년 12월 31일, 1) = 1;
0 == countSelectedDaysInRange(2020년 1월 1일, 2020년 12월 31일, 0) = 1;
위의 코드에는 마지막 날(<= lastdate)이 포함되어 있습니다. 첫 번째 날짜/시간 값에서 시작하여 24시간씩 증가하고 해당 날짜/시간 값이 표현식을 충족하는 경우 개수에 1을 추가합니다.
고통스러운 경험을 통해 날짜와 시간을 올바르게 다루는 것이 어렵다는 것을 알고 있습니다.
내장된 기능을 최대한 활용하세요.
다음에 코드를 유지 관리하는 사람을 위해 코드에 주석을 달아주세요.
코드를 주의 깊게 테스트해보세요!
또한 대략적인 근사치만 필요한 경우에는
(2021년 1월 1일-2020년 1월 1일)/indays(1)*5/7 == 261.428571428571
이는 262 카운트에 가깝습니다.
편집하다: 날짜 차이(2020년 1월 1일,2021년 1월 1일,"일")*5/7 조잡한 대답은 더 간단해 보일 수도 있습니다.
가장 먼저 해야 할 일은 "근무일"을 정의하는 것입니다. 평일(월~금)마다인가요? 은행/공휴일은 어떻습니까? 종교적인 휴일?