1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- """ 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)
|