123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- import sys, os
- sys.path.append('/var/lib/django')
- from django.core.management import setup_environ
- from pbp_com import settings
- setup_environ(settings)
- import re
- import urllib
- import urllib2
- from BeautifulSoup import BeautifulSoup
- import time
- from datetime import datetime, timedelta
- import dateutil
- from almanac.models import Day, AstroChart
- year = '2014'
- place = 'Stonington'
- state = 'ME'
- def get_table(year="", state="", place="", type=""):
- parser = re.compile('\d\d ')
- '''A special parser for lunar fraction tables '''
- lparser = re.compile(' \d\d ')
- if type=="sun":
- type=0
- elif type=="moon":
- type=1
- elif type=="civil_tw":
- type=2
- elif type=="nautical_tw":
- type=3
- elif type=="astro_tw":
- type=4
- elif type=="lunar_fraction":
- type=5
- else:
- type=0
-
- if type < 5:
- url = "http://aa.usno.navy.mil/cgi-bin/aa_rstablew.pl"
- post_data = {'FFX' : '1',
- 'xxy' : year,
- 'type' : type,
- 'st' : state,
- 'place' : place,
- 'ZZZ' : 'END' }
- else:
- url = "http://aa.usno.navy.mil/cgi-bin/aa_moonill2.pl"
- post_data = {'time':'00',
- 'xxy':year,
- 'zone':'-05',
- 'ZZZ':'END'}
-
- data = urllib.urlencode(post_data)
- req = urllib2.Request(url, data)
- response = urllib2.urlopen(req)
- page = response.read()
- data = page.split('\n')
-
- table=[]
- for line in data:
- if type <5:
- if parser.match(line):
- table.append(line)
- else:
- if lparser.match(line):
- table.append(line)
- return table
- ''' End of get_table() '''
- def fix_time(str, today, chart):
- if str == ' ':
- str = None
- else:
- if chart.dst_start < today < chart.dst_end:
- delta=timedelta(hours=1)
- else:
- delta=timedelta(hours=0)
- str= time.strftime("%H:%M", (datetime(*time.strptime(str, "%H%M")[0:5])+delta).timetuple())
- return str
- ''' End of fix_time() '''
- '''### THE HEAVY LIFTING ### '''
- sun_table = get_table(year, state, place, 'sun')
- moon_table = get_table(year, state, place, 'moon')
- civil_tw_table = get_table(year, state, place, 'civil_tw')
- naut_tw_table = get_table(year, state, place, 'nautical_tw')
- astro_tw_table = get_table(year, state, place, 'astro_tw')
- lunar_fraction = get_table(year, '', '', 'lunar_fraction')
- month=0
- astro_table=[]
- ''' Here we go over the table 12 times for each month.
- For each month, we keep running till we hit a blank.
- Load the day, month and year into the table and go. '''
- offset=4
- moon_iter=0
- civil_iter=0
- naut_iter=0
- astro_iter=0
- lunar_offset=8
- lunar_iter=0
- try:
- chart=AstroChart.objects.get(year__exact=year)
- except AstroChart.DoesNotExist:
- pass #Add code here to add chart if it doesn't exist
- while (month < 12):
- month = month +1
- for entry in sun_table:
- if entry[offset:offset+9] == ' ':
- pass
- else:
- if month < 10:
- date = datetime.strptime(year + '0' + str(month)+entry[:2], "%Y%m%d").date()
- else:
- date = datetime.strptime(year + str(month) + entry[:2], "%Y%m%d").date()
- astro_table.append({'date':date, 'sunrise':fix_time(entry[offset:offset+4], date,chart), 'sunset':fix_time(entry[offset+5:offset+9], date,chart)})
- for entry in moon_table:
- if entry[offset:offset+9] == ' ':
- pass
- else:
- date=astro_table[moon_iter]['date']
- astro_table[moon_iter]['moonrise']=fix_time(entry[offset:offset+4],date, chart)
- astro_table[moon_iter]['moonset']=fix_time(entry[offset+5:offset+9], date, chart)
- moon_iter = moon_iter+1
- for entry in civil_tw_table:
- if entry[offset:offset+9] == ' ':
- pass
- else:
- date=astro_table[civil_iter]['date']
- astro_table[civil_iter]['civil_twilight_am']=fix_time(entry[offset:offset+4], date, chart)
- astro_table[civil_iter]['civil_twilight_pm']=fix_time(entry[offset+5:offset+9], date, chart)
- civil_iter = civil_iter+1
- for entry in naut_tw_table:
- if entry[offset:offset+9] == ' ':
- pass
- else:
- date=astro_table[naut_iter]['date']
- astro_table[naut_iter]['nautical_twilight_am']=fix_time(entry[offset:offset+4], date, chart)
- astro_table[naut_iter]['nautical_twilight_pm']=fix_time(entry[offset+5:offset+9], date, chart)
- naut_iter = naut_iter+1
- '''
- Want astronomical twilight?
- for entry in astro_tw_table:
- if entry[offset:offset+9] == ' ':
- pass
- else:
- astro_table[astro_iter]['astro_tw_start']=entry[offset:offset+4]
- astro_table[astro_iter]['astro_tw_end']=entry[offset+5:offset+9]
- astro_iter = astro_iter+1
- '''
- for entry in lunar_fraction:
- if entry[lunar_offset:lunar_offset+4] == ' ':
- pass
- else:
- frac = entry[lunar_offset:lunar_offset+4]
- if frac == "1.00":
- astro_table[lunar_iter]['moonphase']=2 # FULL
- elif frac == "0.00":
- astro_table[lunar_iter]['moonphase']=0 # NEW
- elif 0.6 > float(frac) > 0.5 and past_phase == "full":
- astro_table[lunar_iter]['moonphase']=3 # 3rd Q.
- elif 0.6 > float(frac) > 0.5 and past_phase == "new":
- astro_table[lunar_iter]['moonphase']=1 # 1st Q.
- astro_table[lunar_iter]['moonphase_fraction']=entry[lunar_offset:lunar_offset+4]
- lunar_iter = lunar_iter+1
- if frac == "1.00":
- past_phase = "full"
- elif frac=="0.00":
- past_phase = "new"
- lunar_offset=lunar_offset +9
- offset=offset +11
- ''' Load the data into the DB '''
- for entry in astro_table:
- print entry
- entry['chart']=chart
- day=Day.objects.create(**entry)
- day.save()
|