# -*- coding: utf-8 -*-
'''
星食計算に必要な情報を国立天文台より取得
2013 waku (http://a...content-available-to-author-only...o.jp/wakusan3/)
'''
from urllib import *
from HTMLParser import HTMLParser
import datetime
'''
HTMLパーサー
'''
class KParser( HTMLParser ) :
hms = "00:00:00"
d1 = None
d2 = None
d3 = None
getfl = False
def handle_data( self , data) :
data = data.strip ( " \t \r \n " )
if data and self .getfl :
if self .d1 and self .d2 and self .d3 is None : self .d3 = data
if self .d1 and self .d2 is None : self .d2 = data
if self .d1 is None : self .d1 = float ( data)
if data.strip ( ) == self .hms :
self .getfl = True
def handle_starttag( self , tag, attrs) :
pass
def handle_endtag( self , tag) :
pass
'''
恒星の視位置を返す
'''
def getStarPos( hip, gtimes, tsys, dms) :
spos = [ ]
for dt in gtimes:
mp = KParser( )
params = { 'stype' :3 , 's_hip' :hip, 'year' :dt.year , 'month' :dt.month , 'day' :dt.day , 'hour' :dt.hour , 'min' :dt.minute , 'sec' :dt.second , 'tsys' :tsys, 'dms' :dms}
r= urlopen( 'http://e...content-available-to-author-only...c.jp/cgi-bin/koyomi/cande/stars_rhip.cgi' , urlencode( params) )
mp.hms = "%d:%02d:%02d" % ( int ( params[ 'hour' ] ) , int ( params[ 'min' ] ) , int ( params[ 'sec' ] ) )
mp.feed ( r.read ( ) )
spos.append ( { 'year' :dt.year , 'month' :dt.month , 'day' :dt.day , 'hour' :dt.hour , 'min' :dt.minute , 'sec' :dt.second , 'longitude' : mp.d1 , 'latitude' : mp.d2 } )
return spos
'''
グリニッジ視恒星時を返す
'''
def getGreenwichTime( gtimes, tsys, dms) :
spos = [ ]
for dt in gtimes:
mp = KParser( )
params = { 'year' :dt.year , 'month' :dt.month , 'day' :dt.day , 'hour' :dt.hour , 'min' :dt.minute , 'sec' :dt.second , 'tsys' :tsys, 'dms' :dms}
r= urlopen( 'http://e...content-available-to-author-only...c.jp/cgi-bin/koyomi/cande/gst.cgi' , urlencode( params) )
mp.hms = "%d:%02d:%02d" % ( int ( params[ 'hour' ] ) , int ( params[ 'min' ] ) , int ( params[ 'sec' ] ) )
mp.feed ( r.read ( ) )
spos.append ( { 'year' :dt.year , 'month' :dt.month , 'day' :dt.day , 'hour' :dt.hour , 'min' :dt.minute , 'sec' :dt.second , 'gstime' : mp.d1 } )
return spos
'''
月の地心座標を返す
'''
def getMoon( gtimes, tsys, dms) :
spos = [ ]
for dt in gtimes:
mp = KParser( )
params = { 'year' :dt.year , 'month' :dt.month , 'day' :dt.day , 'hour' :dt.hour , 'min' :dt.minute , 'sec' :dt.second , 'tsys' :tsys, 'dms' :dms, 'body' :10 }
r= urlopen( 'http://e...content-available-to-author-only...c.jp/cgi-bin/koyomi/cande/moon.cgi' , urlencode( params) )
mp.hms = "%d:%02d:%02d" % ( int ( params[ 'hour' ] ) , int ( params[ 'min' ] ) , int ( params[ 'sec' ] ) )
mp.feed ( r.read ( ) )
spos.append ( { 'year' :dt.year , 'month' :dt.month , 'day' :dt.day , 'hour' :dt.hour , 'min' :dt.minute , 'sec' :dt.second , 'longitude' : mp.d1 , 'latitude' : mp.d2 , 'gdistance' : mp.d3 } )
return spos
'''
指定した開始時間から終了時間まで指定間隔(sec)で時間を返す
'''
def getDeltaTime( stime, etime, unit) :
btime = stime
dtimes = [ ]
while btime <= etime:
dtimes.append ( btime)
btime = btime + datetime .timedelta ( seconds= unit)
return dtimes
def exportCSV( spos, gtime, moon, fpath) :
f = open ( fpath, 'w' )
f.write ( "日付,時刻,恒星の視赤経,恒星の視赤緯,グリニッジ恒星時,月の視赤経,月の視赤緯,月の地心距離\n " )
for i in range ( len ( spos) ) :
f.write ( ( "%4d/%02d/%02d,%2d:%02d:%02d,%s,%s,%s,%s,%s,%s\n " ) %
( spos[ i] [ 'year' ] , spos[ i] [ 'month' ] , spos[ i] [ 'day' ] ,
spos[ i] [ 'hour' ] , spos[ i] [ 'min' ] , spos[ i] [ 'sec' ] ,
spos[ i] [ 'longitude' ] , spos[ i] [ 'latitude' ] ,
gtime[ i] [ 'gstime' ] ,
moon[ i] [ 'longitude' ] , moon[ i] [ 'latitude' ] , moon[ i] [ 'gdistance' ] ) )
f.close ( )
if __name__== '__main__' :
stime = datetime .datetime ( 2013 , 9 , 13 , 5 , 0 , 0 ) # 開始時間 (yyyy,m,d,h,M,s)
etime = datetime .datetime ( 2013 , 9 , 13 , 5 , 10 , 0 ) # 終了時間 (yyyy,m,d,h,M,s)
hip = 88125 # HIP番号
tsys = 2 # 0:地球時 1:世界時 2:日本標準時
dms = 1 # 0:(h m s)表示 1:少数表示
save_path = r"occu.csv" # 保存先
spos = getStarPos( hip, getDeltaTime( stime, etime, 60 ) , tsys, dms)
gtime = getGreenwichTime( getDeltaTime( stime, etime, 60 ) , tsys, dms)
moon = getMoon( getDeltaTime( stime, etime, 60 ) , tsys, dms)
exportCSV( spos, gtime, moon, save_path)
# your code goes here
IyAtKi0gIGNvZGluZzogdXRmLTggLSotCicnJwrmmJ/po5/oqIjnrpfjgavlv4XopoHjgarmg4XloLHjgpLlm73nq4vlpKnmloflj7Djgojjgorlj5blvpcKMjAxMyB3YWt1IChodHRwOi8vYS4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uby5qcC93YWt1c2FuMy8pCicnJwpmcm9tIHVybGxpYiBpbXBvcnQgKgpmcm9tIEhUTUxQYXJzZXIgaW1wb3J0IEhUTUxQYXJzZXIKaW1wb3J0IGRhdGV0aW1lCgonJycKSFRNTOODkeODvOOCteODvAonJycKY2xhc3MgS1BhcnNlcihIVE1MUGFyc2VyKToKICAgIGhtcyA9ICIwMDowMDowMCIKICAgIGQxID0gTm9uZQogICAgZDIgPSBOb25lCiAgICBkMyA9IE5vbmUKCiAgICBnZXRmbCA9IEZhbHNlCgogICAgZGVmIGhhbmRsZV9kYXRhKHNlbGYsIGRhdGEpOgogICAgICAgIGRhdGEgPSBkYXRhLnN0cmlwKCIgXHRcclxuIikKCiAgICAgICAgaWYgZGF0YSBhbmQgc2VsZi5nZXRmbDoKICAgICAgICAgICAgaWYgc2VsZi5kMSBhbmQgc2VsZi5kMiBhbmQgc2VsZi5kMyBpcyBOb25lOiBzZWxmLmQzID0gZGF0YQogICAgICAgICAgICBpZiBzZWxmLmQxIGFuZCBzZWxmLmQyIGlzIE5vbmU6IHNlbGYuZDIgPSBkYXRhCiAgICAgICAgICAgIGlmIHNlbGYuZDEgaXMgTm9uZTogc2VsZi5kMSA9IGZsb2F0KGRhdGEpCgogICAgICAgIGlmIGRhdGEuc3RyaXAoKSA9PSBzZWxmLmhtczoKICAgICAgICAgICAgc2VsZi5nZXRmbCA9IFRydWUKCiAgICBkZWYgaGFuZGxlX3N0YXJ0dGFnKHNlbGYsIHRhZywgYXR0cnMpOgogICAgICAgIHBhc3MKCiAgICBkZWYgaGFuZGxlX2VuZHRhZyhzZWxmLCB0YWcpOgogICAgICAgIHBhc3MKCicnJwrmgZLmmJ/jga7oppbkvY3nva7jgpLov5TjgZkKJycnCmRlZiBnZXRTdGFyUG9zKGhpcCwgZ3RpbWVzLCB0c3lzLCBkbXMpOgogICAgc3BvcyA9IFtdCiAgICBmb3IgZHQgaW4gZ3RpbWVzOgogICAgICAgIG1wID0gS1BhcnNlcigpCiAgICAgICAgcGFyYW1zID0geydzdHlwZSc6MywgJ3NfaGlwJzpoaXAsICd5ZWFyJzpkdC55ZWFyLCAnbW9udGgnOmR0Lm1vbnRoLCAnZGF5JzpkdC5kYXksICdob3VyJzpkdC5ob3VyLCAnbWluJzpkdC5taW51dGUsICdzZWMnOmR0LnNlY29uZCwgJ3RzeXMnOnRzeXMsICdkbXMnOmRtc30KCiAgICAgICAgcj11cmxvcGVuKCdodHRwOi8vZS4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uYy5qcC9jZ2ktYmluL2tveW9taS9jYW5kZS9zdGFyc19yaGlwLmNnaScsdXJsZW5jb2RlKHBhcmFtcykpCiAgICAgICAgbXAuaG1zID0gIiVkOiUwMmQ6JTAyZCIgJSAoaW50KHBhcmFtc1snaG91ciddKSwgaW50KHBhcmFtc1snbWluJ10pLCBpbnQocGFyYW1zWydzZWMnXSkpCiAgICAgICAgbXAuZmVlZChyLnJlYWQoKSkKICAgICAgICBzcG9zLmFwcGVuZCh7J3llYXInOmR0LnllYXIsICdtb250aCc6ZHQubW9udGgsICdkYXknOmR0LmRheSwgJ2hvdXInOmR0LmhvdXIsICdtaW4nOmR0Lm1pbnV0ZSwgJ3NlYyc6ZHQuc2Vjb25kLCAnbG9uZ2l0dWRlJzogbXAuZDEsICdsYXRpdHVkZSc6IG1wLmQyfSkKCiAgICByZXR1cm4gc3BvcwogICAgICAgIAoKJycnCuOCsOODquODi+ODg+OCuOimluaBkuaYn+aZguOCkui/lOOBmQonJycKZGVmIGdldEdyZWVud2ljaFRpbWUoZ3RpbWVzLCB0c3lzLCBkbXMpOgogICAgc3BvcyA9IFtdCiAgICBmb3IgZHQgaW4gZ3RpbWVzOgogICAgICAgIG1wID0gS1BhcnNlcigpCiAgICAgICAgcGFyYW1zID0geyd5ZWFyJzpkdC55ZWFyLCAnbW9udGgnOmR0Lm1vbnRoLCAnZGF5JzpkdC5kYXksICdob3VyJzpkdC5ob3VyLCAnbWluJzpkdC5taW51dGUsICdzZWMnOmR0LnNlY29uZCwgJ3RzeXMnOnRzeXMsICdkbXMnOmRtc30KCiAgICAgICAgcj11cmxvcGVuKCdodHRwOi8vZS4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uYy5qcC9jZ2ktYmluL2tveW9taS9jYW5kZS9nc3QuY2dpJyx1cmxlbmNvZGUocGFyYW1zKSkKICAgICAgICBtcC5obXMgPSAiJWQ6JTAyZDolMDJkIiAlIChpbnQocGFyYW1zWydob3VyJ10pLCBpbnQocGFyYW1zWydtaW4nXSksIGludChwYXJhbXNbJ3NlYyddKSkKICAgICAgICBtcC5mZWVkKHIucmVhZCgpKQogICAgICAgIHNwb3MuYXBwZW5kKHsneWVhcic6ZHQueWVhciwgJ21vbnRoJzpkdC5tb250aCwgJ2RheSc6ZHQuZGF5LCAnaG91cic6ZHQuaG91ciwgJ21pbic6ZHQubWludXRlLCAnc2VjJzpkdC5zZWNvbmQsICdnc3RpbWUnOiBtcC5kMX0pCgogICAgcmV0dXJuIHNwb3MKCicnJwrmnIjjga7lnLDlv4PluqfmqJnjgpLov5TjgZkKJycnCmRlZiBnZXRNb29uKGd0aW1lcywgdHN5cywgZG1zKToKICAgIHNwb3MgPSBbXQogICAgZm9yIGR0IGluIGd0aW1lczoKICAgICAgICBtcCA9IEtQYXJzZXIoKQogICAgICAgIHBhcmFtcyA9IHsneWVhcic6ZHQueWVhciwgJ21vbnRoJzpkdC5tb250aCwgJ2RheSc6ZHQuZGF5LCAnaG91cic6ZHQuaG91ciwgJ21pbic6ZHQubWludXRlLCAnc2VjJzpkdC5zZWNvbmQsICd0c3lzJzp0c3lzLCAnZG1zJzpkbXMsICdib2R5JzoxMH0KCiAgICAgICAgcj11cmxvcGVuKCdodHRwOi8vZS4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uYy5qcC9jZ2ktYmluL2tveW9taS9jYW5kZS9tb29uLmNnaScsdXJsZW5jb2RlKHBhcmFtcykpCiAgICAgICAgbXAuaG1zID0gIiVkOiUwMmQ6JTAyZCIgJSAoaW50KHBhcmFtc1snaG91ciddKSwgaW50KHBhcmFtc1snbWluJ10pLCBpbnQocGFyYW1zWydzZWMnXSkpCiAgICAgICAgbXAuZmVlZChyLnJlYWQoKSkKICAgICAgICBzcG9zLmFwcGVuZCh7J3llYXInOmR0LnllYXIsICdtb250aCc6ZHQubW9udGgsICdkYXknOmR0LmRheSwgJ2hvdXInOmR0LmhvdXIsICdtaW4nOmR0Lm1pbnV0ZSwgJ3NlYyc6ZHQuc2Vjb25kLCAnbG9uZ2l0dWRlJzogbXAuZDEsICdsYXRpdHVkZSc6IG1wLmQyLCAnZ2Rpc3RhbmNlJzogbXAuZDN9KQoKICAgIHJldHVybiBzcG9zCiAgICAgICAgCgonJycK5oyH5a6a44GX44Gf6ZaL5aeL5pmC6ZaT44GL44KJ57WC5LqG5pmC6ZaT44G+44Gn5oyH5a6a6ZaT6ZqUKHNlYynjgafmmYLplpPjgpLov5TjgZkKJycnCmRlZiBnZXREZWx0YVRpbWUoc3RpbWUsIGV0aW1lLCB1bml0KToKICAgIGJ0aW1lID0gc3RpbWUKICAgIGR0aW1lcyA9IFtdCgogICAgd2hpbGUgYnRpbWUgPD0gZXRpbWU6CiAgICAgICAgZHRpbWVzLmFwcGVuZChidGltZSkKICAgICAgICBidGltZSA9IGJ0aW1lICsgZGF0ZXRpbWUudGltZWRlbHRhKHNlY29uZHM9dW5pdCkKICAgIAogICAgcmV0dXJuIGR0aW1lcwoKZGVmIGV4cG9ydENTVihzcG9zLCBndGltZSwgbW9vbiwgZnBhdGgpOgogICAgZiA9IG9wZW4oZnBhdGgsICd3JykKICAgIGYud3JpdGUoIuaXpeS7mCzmmYLliLss5oGS5pif44Gu6KaW6LWk57WMLOaBkuaYn+OBruimlui1pOe3ryzjgrDjg6rjg4vjg4PjgrjmgZLmmJ/mmYIs5pyI44Gu6KaW6LWk57WMLOaciOOBruimlui1pOe3ryzmnIjjga7lnLDlv4Pot53pm6JcbiIpCiAgICBmb3IgaSBpbiByYW5nZShsZW4oc3BvcykpOgogICAgICAgIGYud3JpdGUoKCIlNGQvJTAyZC8lMDJkLCUyZDolMDJkOiUwMmQsJXMsJXMsJXMsJXMsJXMsJXNcbiIpICUgCiAgICAgICAgICAgICAgICAgICAgKHNwb3NbaV1bJ3llYXInXSwgc3Bvc1tpXVsnbW9udGgnXSwgc3Bvc1tpXVsnZGF5J10sCiAgICAgICAgICAgICAgICAgICAgc3Bvc1tpXVsnaG91ciddLCBzcG9zW2ldWydtaW4nXSwgc3Bvc1tpXVsnc2VjJ10sCiAgICAgICAgICAgICAgICAgICAgc3Bvc1tpXVsnbG9uZ2l0dWRlJ10sc3Bvc1tpXVsnbGF0aXR1ZGUnXSwKICAgICAgICAgICAgICAgICAgICBndGltZVtpXVsnZ3N0aW1lJ10sCiAgICAgICAgICAgICAgICAgICAgbW9vbltpXVsnbG9uZ2l0dWRlJ10sbW9vbltpXVsnbGF0aXR1ZGUnXSxtb29uW2ldWydnZGlzdGFuY2UnXSkpCiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgCiAgICBmLmNsb3NlKCkKCmlmIF9fbmFtZV9fPT0nX19tYWluX18nOgogICAgc3RpbWUgPSBkYXRldGltZS5kYXRldGltZSgyMDEzLDksMTMsNSwwLDApICMg6ZaL5aeL5pmC6ZaTICh5eXl5LG0sZCxoLE0scykKICAgIGV0aW1lID0gZGF0ZXRpbWUuZGF0ZXRpbWUoMjAxMyw5LDEzLDUsMTAsMCkgIyDntYLkuobmmYLplpMgKHl5eXksbSxkLGgsTSxzKQogICAgaGlwID0gODgxMjUgIyBISVDnlarlj7cKCiAgICB0c3lzID0gMiAjIDA65Zyw55CD5pmC44CAMTrkuJbnlYzmmYLjgIAyOuaXpeacrOaomea6luaZggogICAgZG1zID0gMSAjIDA6KGggbSBzKeihqOekuiAxOuWwkeaVsOihqOekugogICAgc2F2ZV9wYXRoID0gciJvY2N1LmNzdiIgIyDkv53lrZjlhYgKCiAgICBzcG9zID0gZ2V0U3RhclBvcyhoaXAsICBnZXREZWx0YVRpbWUoc3RpbWUsIGV0aW1lLCA2MCksIHRzeXMsIGRtcykKICAgIGd0aW1lID0gZ2V0R3JlZW53aWNoVGltZShnZXREZWx0YVRpbWUoc3RpbWUsIGV0aW1lLCA2MCksIHRzeXMsIGRtcykKICAgIG1vb24gPSBnZXRNb29uKGdldERlbHRhVGltZShzdGltZSwgZXRpbWUsIDYwKSwgdHN5cywgZG1zKQogICAgZXhwb3J0Q1NWKHNwb3MsZ3RpbWUsbW9vbixzYXZlX3BhdGgpCiMgeW91ciBjb2RlIGdvZXMgaGVyZQ==