%PDF- %PDF-
Direktori : /data/old/usr/local/lib/python3.6/site-packages/astral/ |
Current File : //data/old/usr/local/lib/python3.6/site-packages/astral/moon.py |
import datetime from math import degrees, radians, sin, floor, ceil, fabs from typing import Optional from astral import today from astral.sun import julianday __all__ = ["phase"] def proper_angle(value: float) -> float: if value > 0.0: value /= 360.0 return (value - floor(value)) * 360.0 else: tmp = ceil(fabs(value / 360.0)) return value + tmp * 360.0 def _phase_asfloat(date: datetime.date) -> float: jd = julianday(date) DT = pow((jd - 2382148), 2) / (41048480 * 86400) T = (jd + DT - 2451545.0) / 36525 T2 = pow(T, 2) T3 = pow(T, 3) D = 297.85 + (445267.1115 * T) - (0.0016300 * T2) + (T3 / 545868) D = radians(proper_angle(D)) M = 357.53 + (35999.0503 * T) M = radians(proper_angle(M)) M1 = 134.96 + (477198.8676 * T) + (0.0089970 * T2) + (T3 / 69699) M1 = radians(proper_angle(M1)) elong = degrees(D) + 6.29 * sin(M1) elong -= 2.10 * sin(M) elong += 1.27 * sin(2 * D - M1) elong += 0.66 * sin(2 * D) elong = proper_angle(elong) elong = round(elong) moon = ((elong + 6.43) / 360) * 28 return moon def phase(date: Optional[datetime.date] = None) -> float: """Calculates the phase of the moon on the specified date. Args: date: The date to calculate the phase for. Dates are always in the UTC timezone. If not specified then today's date is used. Returns: A number designating the phase. ============ ============== 0 .. 6.99 New moon 7 .. 13.99 First quarter 14 .. 20.99 Full moon 21 .. 27.99 Last quarter ============ ============== """ if date is None: date = today() moon = _phase_asfloat(date) if moon >= 28.0: moon -= 28.0 return moon