プログラム日記φ(..)

おもにPython関係のプログラムメモ

Pythonで今日の月齢を計算してみる

本日の月齢を知りたかったので、Pythonで月齢を計算してみた。

 

前回の新月時刻から、ある日の正午時刻までの経過日数を「正午月齢」と言うそうで、国立天文台からも、その日の月齢が発表されてますが、

 

ある時刻からの経過時間を求めるのは素人でもできますが、新月の瞬間の時刻を求めるのは素人ではなかなかにもって難しいので、そんな時は、人が作ってくれてツールを使うのが手っ取り早いので、(今回の要件の場合にはそれで事足りるので)

 

Python向け天文計算ソフトPyEphem
https://rhodesmill.org/pyephem/
を使って前回の新月時刻を求め、本日の月齢を計算してみました。

 

月齢の説明は国立天文さんの以下のページがわかりやすいです。
質問2-4)「月齢」ってなに?なぜ小数がつくの? | 国立天文台(NAOJ)

 

 

 
import ephem
from datetime import datetime 
from pytz import timezone

def lunar_date_calc(year, month, day, hour, min, sec):

    # 指定時刻をUTCに変換
    jst = datetime(year, month, day, hour, min, sec)
    local_tz = timezone('Asia/Tokyo')
    jst = local_tz.localize(jst)
    utc = jst.astimezone(timezone('UTC'))

    # 前回新月時刻を求め結果をJSTに変換
    previous_new_moon_time = ephem.previous_new_moon(utc).datetime()
    previous_new_moon_time = timezone('UTC').localize(previous_new_moon_time)
    previous_new_moon_time_jst = previous_new_moon_time.astimezone(timezone('Asia/Tokyo'))

    # 前回新月時刻から指定時刻までの経過時間から月齢を求める(小数点2位以下は四捨五入)
    lunar_date = jst - previous_new_moon_time_jst
    lunar_date = round(lunar_date.days + lunar_date.seconds/(60*60*24.), 1)
    return lunar_date


# 月齢を求めたい日時の正午時刻を与え「正午月齢」を求めてみる。
# 正午時刻以外を与えると、その時刻での月齢になります。
year=2018 month=10 day=4 hour=12 min=0 sec=0 lunar_date = lunar_date_calc(year, month, day, hour, min, sec) print '月齢=', lunar_date

 

結果「月齢= 24.4」と正しく求まりました。

 

めでたし、めでたし。