나는 2017.05.10 -> 2017.01.01
또는 2016.08.19 -> 2016.01.01
과 같이 일년 중 첫 번째 날을 Q로 얻는 효율적인 함수를 찾고 있습니다.KDB/Q에서 첫해를 얻는 방법?
다음 조각은 작동하지만, "D"의 범위의 일부
{"D"$(string `year$x),".01.01"} .z.d
나는 2017.05.10 -> 2017.01.01
또는 2016.08.19 -> 2016.01.01
과 같이 일년 중 첫 번째 날을 Q로 얻는 효율적인 함수를 찾고 있습니다.KDB/Q에서 첫해를 얻는 방법?
다음 조각은 작동하지만, "D"의 범위의 일부
{"D"$(string `year$x),".01.01"} .z.d
이런 종류의 계산에서 공통적 인 트릭은 날짜와 달리 월이 매우 규칙적이라는 사실을 사용하는 것입니다. 매년 정확하게 12 개월이 걸립니다. 따라서 올해의 첫 날을 찾기 위해, 우리는 먼저 12의 여러에 둘레 다음 달 형식으로 날짜를 아래로 캐스팅 날짜 형식으로 다시 캐스팅 :
q)f:"d"$12 xbar"m"$
q)f .z.d
2017.01.01
또는 OP의 날짜와 :
q)f 2017.05.10 2016.08.19
2017.01.01 2016.01.01
효율적이지 않다 :
q)"d"$ceiling 365.245*-2000+`year$.z.Z
2017.01.01
(날짜입니다 Y2K에서 일)
잭 감사합니다. 외모는 까다 롭지만 잘 작동합니다! –
이 예제는 대부분의 주어진 날짜에 적용될 수 있다고 생각합니다. 그러나 2290 년에 날짜를 입력하면 두 번째 날짜가 표시됩니다. –
해당 날짜를 염두에 둔다면 365.245에서 365.2425로 변경하십시오. (또는 내 대답을 참조하십시오.) –
그냥 믹스에 또 다른 변화를 던져 :
q){.Q.addmonths[x;1-`mm$x]+1-`dd$x} .z.d
2017.01.01
완전을 위해 ['.Q.addmonths']에 대한 위키 페이지를보십시오 (http://code.kx.com/q/ref/dotq/#qaddmonths) –
그것의 이익을 위해 또 다른 해결책 :
을{"d"$1+(-).`month`mm$x}.z.d
2017.01.01
알렉스, 빠르고 명확한 솔루션을 주셔서 감사합니다. –