甲府気象台のwebページ表から、富士山初冠雪日を取得するプログラムを作る。
以下がプログラム。
関数 read_FirstSnowFuji()が初冠雪日を取得するモジュールで、年、月、日をnumpyの配列として返す。HTMLから表を読むのにtable parserを用いている。
メインプログラムでは、日付をscikits.timeseriesで年初からの日にち(1月1日を1とする)に変換し、グラフにしている。平均値を黒い実線で、平均値から標準偏差(約14日)の2倍離れた値に黒点線を引いた。ばらつきがかなり大きい印象だ。今年は少しだけ平年より早い。
read_FirstSnowFuji.py
import numpy as np # table parser from http://simbot.wordpress.com/2006/05/17/html-table-parser-using-python/ from table_parser import * def read_FirstSnowFuji(): import urllib """ read first snow cover day of the FUJI mountain from KOFU local meteorological observatory usage: year,month,day=read_FirstSnowFuji() input none output year,month,day: first snow cover day (numpy array) """ f = urllib.urlopen('http://www.jma-net.go.jp/kofu/menu/siryo_hatsukansetsu.dat.html') p = TableParser() p.feed(f.read()) f.close() data=p.doc # Get to the data #get year=[[],[],[]] # 3 column month=[[],[],[]] # 3 column day=[[],[],[]] # 3 column for d in data[0][1:]: for n,c in enumerate([0,4,8]): if not d[c]=="": year[n].append(int(d[c])) mi,di=d[c+1].split("/") month[n].append(int(mi)) day[n].append(int(di)) # to numpy array ayear=np.array([],dtype="i4") amonth=np.array([],dtype="i4") aday=np.array([],dtype="i4") for n in range(3): ayear=np.append(ayear,year[n]) amonth=np.append(amonth,month[n]) aday=np.append(aday,day[n]) return ayear,amonth,aday ############################################ if __name__ == '__main__': import matplotlib.pyplot as plt import scikits.timeseries as ts ayear,amonth,aday= read_FirstSnowFuji() days=np.array([],dtype="i4") for n in range(ayear.size): td=ts.Date("D",year=ayear[n],month=amonth[n],day=aday[n]) days=np.append(days,td.day_of_year) #plot plt.plot(ayear,days,"b-") mean=days.mean() stdp=days.mean()+2*days.std() stdm=days.mean()-2*days.std() plt.plot([ayear[0],ayear[-1]],[mean,mean],"k-") plt.plot([ayear[0],ayear[-1]],[stdp,stdp],"k--") plt.plot([ayear[0],ayear[-1]],[stdm,stdm],"k--") plt.xlim(ayear[0],ayear[-1]) plt.xlabel("year") plt.ylabel("day of year") plt.savefig("FujiFirstSnow.png") plt.show()
0 件のコメント:
コメントを投稿