2023년 11월 20일 월요일

Excel을 이용한 음력 양력 변환기 만들기 : 음력 양력 일괄 변환 가능

2024-02-09-금 수정

역법이 뭔지는 여길 참고 : 역법, 양력, 음력, 달력 계산하기

4주8자 구하는 법은 여길 참고 :  사주팔자 모든 조합 (51만8천4백) 계산법


1. 음력 양력 변환하는 정확한 공식은 없다. 

양력도 반 만 년(4천 년) 지나면 1일 정도 오차가 발생하고, 음력과 양력을 일치 시키는 19년 주기도 반 만 년(5700년) 지나면 26일 정도 오차가 발생한다. 5천 년 전, 5천 년 후 음력 양력을 변환하는 짓은 의미가 없을 것이다.

그래도 현재와 가까운 시기의 음력 양력을 변환하는 깔끔한 공식이 있다면 좋겠지? 가까운 미래 것은 계산으로 구해야 한다. 계산법은 위의 링크에서 역법을 참고할 것. 시간 차가 많이 나면 계산으로 구한 날짜가 틀릴 수도 있다. 양력 24절기는 100년 이내, 음력은 10년 이내에서만 적용하자. 고로 아주 옛날 것은 과거 음력 기록을 가지고 검색해야 한다. 음력의 삭망일의 주기를 보면 진동하는 것처럼 보이기 때문에 단순히 계산을 해서 구한 게 아니다. 오히려 주기를 오랜 동안 누적된 측정 값에서 추출한 것이다. 그래서 측정한 값과 차이가 있다.


위의 19년 주기를 보면 음력 날짜 규칙이 보이지 않을 것이다. 음력을 계산하려면 일단 양력(24절기)이 필요하다. 양력도 날짜가 아닌 시간 단위까지 필요하다. 24절기 날짜와 시간을 알아야 윤달을 넣어야 할 때를 알 수 있다. 또한 달의 삭/망(초하룻날/보름) 날짜와 시간까지 알아야 한다. 달이 뜨지 않는 삭일 때의 양력 날짜와 시간을 알아야 음력 1일을 결정할 수 있다. 음력 1일이 결정 되면 그 음력의 마지막 날(그믐날)은 자동으로 29/30일로 결정 된다. 음력 15일에 꼭 보름달이 뜨는 건 아니다. 이상하게 보름달이 15, 16, 17일에 걸쳐 있다. 달의 공전 속력이 변하나? 왜 이러지? ㅋㅋㅋ 

이 글은 과거 음력 DB를 이용해서 양음력 변환하는 하는 방법이고 예측 계산은 역법에서 참고 하라. 그리고 음력 날짜에서 4주8자를 결정하는 방법은 4주8자 계산법을 참고하고 여기선 일주만 계산해 주는 방법만 나온다.


2. 그럼 어떻게 계산할 것이냐? 알고리즘은 다음과 같다.

  1. 양력의 경우 1900년 01월 01일 기준 이후는 컴퓨터가 자동 계산해 준다.
  2. 1900년 01월 01일 이전은 직접 년, 월, 일 분해해서 계산해야 한다. (그래서 안 함)
  3. 공신력 있는 사이트에서 양력 음력 변환 표를 구해 기준 일자를 검색하여 찾는다.
  4. 기준 일자는 1900년 이후의 음력의 각 달 1일에 해당하는 양력일이다.
  5. 음력 X월의 1일 → 양력 날짜, 29/30일 구분, 윤달 표시,  60갑자 표현(년월일)
  6. 4주8자 볼 때의 60갑자 표현은 년월일은 검색으로 찾고 시는 간단하게 계산 된다.
  7. 음력 양력 모두 특정 기준 양력일(음력 X월 1일에 해당)과 날짜 차이로 검색을 한다.
  8. 가장 가까운 기준 월 검색 방법 : 기준 월 ≤ 검색 날짜 < 다음 월
  9. 가장 가까운 기준 월과 날짜 차이(30일 미만)로 나머지는 계산을 한다.

변환 가능한 날자 범위 : 1900년 이전은 안 한다. 양력 2050년까지만 변환표가 있다.

  • 음력 1900년 01월 01일 ~ 2050년 11월 01일
  • 양력 1900년 01월 31일 ~ 2050년 12월 14일

변환표는 여기에 : 



3. 예를 들어 음력 1923년 10월 13일의 양력을 찾고 싶다면?

가장 가까운 기준 일인 음력 1923년 10월 01일(양력 1923년 11월 09일에 해당)을 찾는다.

날짜 차이 계산 : 1923년 10월 13일(검색일) - 1923년 10월 01일(기준일) = 12일

기준 음력 날짜 검색 : 

  1. 양력 : 1923년 11월 09일 + 12일 = 1923년 11월 21일(변환 날짜)
  2. 요일 : 금 → weekday(1923년 11월 21일, 1) 함수 사용, 일~토요일 = 1~7
  3. 음력 : 1923년 10월 01일 + 12일 = 1923년 10월 13일(검색 날짜) 
  4. 윤달 : 평 → 음력으로 검색할 경우는 다음 달이 윤달인지 확인 (윤달이면 2개 표시)
  5. 대소 : 29
  6. 년주 : 계해
  7. 월주 : 계해
  8. 일주 : 병술 → + 12일 60갑자 검색

요약하면 음력 검색일 → 음력 기준일 → 양력 기준일 → 최종 변환일 계산 순서로 처리한다.

이런 처리 방법에 있어 문제는 검색 시간이 많이 소모 되는 것이다. 검색을 빠르게 하기 위해선 검색 표를 쪼개야 한다. 예를 들어 음력은 12개월 단위니까 윤달을 제외하면 년월이 12단위이기 때문에 년월을 뽑아 기준일의 위치를 간단하게 계산할 수 있다. 이 때 같은 달의 윤달이 있단 정보가 검색 되면, 윤달표에서 윤달만 따로 검색한다. 윤달은 목록을 처음부터 비교해서 찾아야 하니 시간 소모가 많다. 윤달의 음력 날짜를 변환하면 양력 날짜 2개가 나와야 한다.

요일 계산법은 Excel 함수 weekday(검색일, 1)을 사용한다. 

이 함수에 문제가 있는데 1900년 1월, 2월은 하루씩 틀린다. 3월부터 사용한다.

그러면 일월화수목금토=1234567 숫자가 나오는데, 문자로 바꾸기만 하면 된다.


4. 반대의 경우로 양력 1923년 11월 21일의 음력을 찾고 싶다면?

가장 가까운 기준 일인 양력 1923년 11월 09일(음력 10월 01일에 해당)을 찾는다.

찾는 방법은 Excel 함수 vlookup(검색일, 표, 칼럼, 유사 일치)를 사용하면 된다.

날짜 차이 계산 : 1923년 11월 21일(검색일) - 1923년 11월 09일(기준일) = 12일

기준 음력 날짜 검색 : 

  1. 양력 : 1923년 11월 09일 + 12일 = 1923년 11월 21일(검색 날짜)
  2. 요일 : 금 → weekday(1923년 11월 21일, 1) 함수 사용, 일~토요일 = 1~7
  3. 음력 : 1923년 10월 01일 + 12일 = 1923년 10월 13일(변환 날짜) 
  4. 윤달 : 평
  5. 대소 : 29
  6. 년주 : 계해
  7. 월주 : 계해
  8. 일주 : 병술 → + 12일 60갑자 검색

요약하면 양력 검색일 → 양력 기준일 → 음력 기준일 → 최종 변환일 계산 순서로 처리한다.

간단한 계산에 의해서 원하는 음력 날짜를 쉽게 얻는다. 여기서 문제는 양력 기준일을 찾는데 시간이 많이 소모된다는 것이다. 양력도 매월 1일 기준 12개월 단위로 배치하면 쉽게 위치 계산을 할 수 있다. 고로 양력 1일을 기준으로 음력 변환표를 만들어 주면 좋겠는데, 문제는 날짜 보간법 계산이 어려운 건 양력이 아니라 음력인 것이다. 그래서 음력으로 매월 1일을 기준으로 삼은 것이다. 왜냐하면 음력 윤달 삽입 지점과 29/30일 대소 구분 규칙을 모르니까. 음력으로 날짜 차이를 더해주려면 다음 달이 윤달인지 아닌지 알아야 하고, 이번 달의 크기(29/30)을 알아야 한다. 그래서 다음 달로 넘어가는 경우를 처리해 줘야 한다. 양력은 그냥 더하면 컴퓨터가 알아서 해주지만, 음력은 프로그래머가 직접 처리 해야 한다.

만약 양력 1일을 기준일로 해서 검색하여 음력 변환을 하겠다면 아래 알고리즘을 따라야 한다.


그래서 위와 같은 알고리즘에 따라 양력일을 양력 기준일(1일)로 빠르게 검색한 후에, 그 날에 해당하는 음력을 다시 음력 기준일(1일)로 빠르게 검색한다. 이 음력 1일과 다음 음력 1일의 양력 기준일 2개로 양력 검색일과 비교하면, 적절한 음력 달의 1일(양력 기준일)을 선택할 수 있게 된다. 이렇게 해야 29/30일 이내의 날짜 차이로 계산을 할 수 있다. 그래서 이렇게 복잡하게 안 하고, Excel 함수를 이용해서 바로 양력 기준일 검색을 한다.

Excel 함수를 사용한다면 vlookup(검색일, 통합 검색표, 원하는 칼럼, 유사 검색)을 쓴다. 그러면 양력 기준일이 그냥 나온다. 처리 속도도 생각보다 빠르다. 대량으로 일괄 처리 변환이 가능하다. 실제로 이 방법으로 양력 1일 기준의 변환 표를 만들 수 있다.



5. 일주의 60갑자 순서 검색은?

간단한 구현은 60개를 나열하여 문자열을 비교 검색하고 순번을 찾은 후에, 날짜 차이를 더하고, 그 순번을 Index로 하여 다시 문자열을 검색하는 것이다. 첫 단계 문자열 비교 검색에서 시간 소모가 좀 있다. 여러 날짜를 일괄적 변환 처리할 때는 매우 느리게 된다.


위와 같은 2차원 배열을 만들면 문자열 비교 검색을 최대 5~6회 수준에서 빨리 할 수 있고 60갑자의 순서 번호를 빨리 계산할 수 있다. 이 순서 번호를 얻었다면 거기에 날짜 차이를 더하고 원하는 60갑자 문자열을 얻는다. 60갑자 순번은 아래 목록과 같다. 

Excel 함수 index(60갑자표, 순번, 원하는 칼럼) 하면 60갑자 검색을 빠르고 쉽게 할 수 있다.

날짜 차를 더했더니 60을 넘게 되면 -60을 해 주면 된다.

  1. 갑자
  2. 을축
  3. 병인
  4. 정묘
  5. 무진
  6. 기사
  7. 경오
  8. 신미
  9. 임신
  10. 계유
  11. 갑술
  12. 을해
  13. 병자
  14. 정축
  15. 무인
  16. 기묘
  17. 경진
  18. 신사
  19. 임오
  20. 계미
  21. 갑신
  22. 을유
  23. 병술
  24. 정해
  25. 무자
  26. 기축
  27. 경인
  28. 신묘
  29. 임진
  30. 계사
  31. 갑오
  32. 을미
  33. 병신
  34. 정유
  35. 무술
  36. 기해
  37. 경자
  38. 신축
  39. 임인
  40. 계묘
  41. 갑진
  42. 을사
  43. 병오
  44. 정미
  45. 무신
  46. 기유
  47. 경술
  48. 신해
  49. 임자
  50. 계축
  51. 갑인
  52. 을묘
  53. 병진
  54. 정사
  55. 무오
  56. 기미
  57. 경신
  58. 신유
  59. 임술
  60. 계해


자, 그러면 대량으로 음력 양력 변환을 할 수 있을 것이다. 날짜 하나씩 바꾸기 피곤하지?

일괄 변환 결과 검증용 사이트 :



이렇게 해서 1900년 ~ 2050년까지 양력 음력을 일괄 변환할 수 있게 되었다.





요즘 전 세계적으로 보수 우익이 꼴통화 된 거 같다.
왜 질이 떨어지는 대통령들이 자꾸 나오지?
미국의 막말통령? 트럼프 ㅋㅋㅋ 어디로 튈까?
우크라이나 바지통령? 젤렌스키는 안 해도 되는 전쟁을 하고, 분단까지 되겠네? 바보
이스라엘 극우총리? 네타냐후도 안 해도 되는 전쟁을 하고 있네. 이슬람 옛날과 달라
한국의 이명박, 박근혜(최순실), 윤석열(김건희/천공) 도대체 이들은 정체는 뭐냐?
사기꾼이냐? 바보냐? 훈련이 안 되어서? 누가 대통령이고 누가 괴뢰傀儡냐?
이거 민주주의 국가의 위기 아닌가? 사이비 정당과 사이비 언론이 국민을 속이네? 
아니면 국민 중에 바보가 많은 것인가? 99%는 정보 부족이니 바보라고 봐야 하겠지?
이 시대 민주주의가 중우정치가 되다니? 학교 교육과 집안 교육이 문제로다.

괴ː뢰 (傀儡) 【명사】① 꼭두각시.② 망석중이.③ 허수아비.

댓글 없음:

댓글 쓰기