1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- """ Function for generating arbitrary moon jds based on a given date.
- Copyright (c) 2009, Colin Powell
- All rights reserved.
- Basic key
- 0 = 'New Moon'
- 1 = 'Waxing Crescent Moon'
- 2 = 'Quarter Moon'
- 3 = 'Waxing Gibbous Moon'
- 4 = 'Full Moon'
- 5 = 'Waning Gibbous Moon'
- 6 = 'Last Quarter Moon'
- 7 = 'Waning Crescent'
- Trig key
- 0 = New
- 4 = Waxing crecent
- 8 = Quarter
- 15 = Full
- 20 = Wanning gibbous
- 24 = Last Quarter
- 29 = New
- """
- import math
- from datetime import datetime
- def moon_phase(date):
- """ Returns a percentage representing the state of the moon on a given date
-
- """
- date = datetime.strptime(date, "%Y-%m-%d")
- if date.month < 3:
- year = date.year - 1
- month = date.month + 12
- else:
- year = date.year
- month = date.month
- month += 1
- jd = (365.25 * year) + (30.6 * month) + (date.day - 694039.09)
- jd /= 29.53058868
- b = int(jd)
- jd -= b
- # if jd < 4:
- # b=4-jd
- # else:
- # b=8-jd
- b = jd * 8 + 0.5
- if b == 8:
- b = 0
- return b
- def jdn(date):
- a = (14 - date.month) // 12
- y = date.year + 4800 - a
- m = date.month + (12 * a) - 3
- p = date.day + (((153 * m) + 2) // 5) + (365 * y)
- q = (y // 4) - (y // 100) + (y // 400) - 32045
- return p + q
- def moon_phase_accurate_but_broken(date):
- n = math.floor(12.37 * (date.year - 1900 + ((1.0 + date.month - 0.5) / 12.0)))
- RAD = 3.14159265 / 180.0
- t = n / 1236.85
- t2 = t * t
- ase = 359.2242 + 29.105356 * n
- am = 306.0253 + 385.816918 * n + 0.010730 * t2
- xtra = 0.75933 + 1.53058868 * n + ((1.178e-4) - (1.55e-7) * t) * t2
- xtra += (0.1734 - 3.93e-4 * t) * math.sin(RAD * ase) - 0.4068 * math.sin(RAD * am)
- if xtra > 0.0:
- i = math.floor(xtra)
- else:
- i = math.ceil(xtra - 1.0)
- j1 = jdn(date)
- jd = (2415020 + 28 * n) + i
- p = (j1 - jd + 30) % 30
- if p < 14.5:
- p = 14.5 - p
- else:
- p = 29 - p
- return p / 14.5
|