日照時間で感じる季節の移り変わり - 1 -  データ収集、スクレイピングまで

節分、冬最後の日

 暦の上では最後の冬の日となりました。2 月 2 日が節分になるのは、何でも 1897 年以来 124 年ぶりだそうです。

 今日の東京は、昼間は 15 ℃位まで気温が上がり、体を動かすと、長袖一枚でも汗ばんでくる暖かな陽気でした。もっとも、朝9時近くまでは雨、そして、昼間の暖かさとは裏腹に、夕方からは信じられない位冷たい風が強まり、どんどん気温が落ちて行きました。要するに、寒冷前線の通過の影響が大きく出た一日でした。ということは、どうやら明日は寒くなりそうです。

 春遠からじと言っても、寒い日は少なからずまだありそうです。けれど、今年もそうでしたが、1 月も半ば位になってくると、日差しの力強さが増しているのを感じます。特に家から急に外出した時など、日差しの印象と気温の差に驚かされます。

 いつもは天気図と合わせて、地上付近や高層の風や気温の分布などの変化の予報を眺めていたのですが、もう少し原始的に、日照時間とか、太陽の高さがどのように変化しているのかに目を向けて、季節の変化を振り返ってみることとしました。

 

目次

節分、冬最後の日

1.日照時間のデータ集め

2.さあ、Beautiful Soup の出番です…

3.次は、Numpy の出番です

4.最後は、pandas です

まとめ

 

1.日照時間のデータ集め

 こうした情報も、いつも通り気象庁にお世話になるのかな、と思っていたところ、検索をかけてみると、どうやら、国立天文台の方が担当 (?) のようです。

eco.mtk.nao.ac.jp

 上のサイトでは、各都道府県の県庁所在地における、日の出、南中、日の入り時刻、太陽の方位、高度変化が月別に、3年分見ることができます。

 ご覧頂くと分かりますが、日々のデータの見たいところを眺めながら何となく納得…、でも良いのですが、これだけ詳細にまとまっているので、お借りして、Visualize したら面白いだろうな、ということで、久しぶりにいつもと違うデータをいじらせて頂くこととしました。

 

2.さあ、Beautiful Soup の出番です…

 まずは、ページのソースを拝見しましょう。

 例えば、東京都の 2021 年 2 月の『日の出入り』ページで、右クリックして「ページのソースを表示(V) Ctrl+U」を表示させてみました。

<td id="m0201"> 1</td><td> 6:41</td> <td>110.6</td> <td>11:55</td> <td> 37.3</td> <td>17:08</td> <td>249.6</td></tr> <tr><td> 2</td> <td> 6:40</td> <td>110.2</td> ……

のような感じで、時刻データ等は <td> タグで挟まれているので、ここをお借りすることとします。

import urllib.request
from bs4 import BeautifulSoup

hinodeiri = "https://eco.mtk.nao.ac.jp/koyomi/dni/2021/s1302.html"

with urllib.request.urlopen(hinodeiri) as deiri:
html = deiri.read()
soup = BeautifulSoup(html, "html.parser")
srsss = soup.find_all('td')

print(srsss)

 これで、先ほど表示させたページのソースの <td> タグだけが取れていれば、データ収集ひとまず完了です。結果は以下の通りです。

[<td id="m0201"> 1</td>, <td> 6:41</td>, <td>110.6</td>, <td>11:55</td>, <td> 37.3</td>, <td>17:08</td>, <td>249.6</td>, <td> 2</td>, <td> 6:40</td>, <td>110.2</td>, <td>11:55</td>, <td> 37.6</td>, <td>17:09</td>, <td>249.9</td>, <td> 3</td>, <td> 6:40</td>, ……

良さそうです。続いて、タグ内の数値だけお借りしましょう。

A = []
for srss in srsss:
a=srss.contents[0]
A.append(a)
[' 1', ' 6:41', '110.6', '11:55', ' 37.3', '17:08', '249.6', ' 2', ' 6:40', '110.2', '11:55', ' 37.6', '17:09', '249.9', ' 3', ' 6:40', '109.9', '11:55', ' 37.9', '17:10', '250.3', ' 4', ' 6:39', '109.5', '11:55', ' 38.2', '17:12', '250.7', ' 5', ' 6:38', '109.1', ……

無事にリストになってくれました。

 『日の出入り』ページをから分かるように、データは、

 2月の 28 日 ( 行 ) × 「日付、日の出、方位、南中、高度、日の入り、方位」の7 列

の配列となっています。先の予定は特に決めていませんが、ひとまず配列の形を整えることとしました。

 

3.次は、Numpy の出番です

import numpy as np

B = np.array(A).reshape(28,7)

といっても、reshape するだけですが、格段にサイトの表に近づきました。

[[' 1' ' 6:41' '110.6' '11:55' ' 37.3' '17:08' '249.6']
[' 2' ' 6:40' '110.2' '11:55' ' 37.6' '17:09' '249.9']
[' 3' ' 6:40' '109.9' '11:55' ' 37.9' '17:10' '250.3']
……

 よく見ると、日の出の時刻が、時間の方が '6' のみになっています。6 が一文字なのか、空白付きなのか、結果からははっきり分かりませんが、あとで、pandas を使う時に、エラーになりそうな感じがプンプンします。

 ということで、時間も二桁表示に変えておくこととしました。

for m in range(28):
B[m,1] = B[m,1].replace(' ', '0')
[[' 1' '06:41' '110.6' '11:55' ' 37.3' '17:08' '249.6']
[' 2' '06:40' '110.2' '11:55' ' 37.6' '17:09' '249.9']
[' 3' '06:40' '109.9' '11:55' ' 37.9' '17:10' '250.3']
……

 これならデータフレームで datetime を使う時にも、何の問題もなく扱えそうです。

 

4.最後は、pandas です

 まだ、どんな感じでデータをいじるか、何も決めていないのですが、ひとまずデータフレームにして、準備を整えます。

import pandas as pd

s = pd.DataFrame(B)
s.columns=['Date', 'SR_time', 'SR_dir', 'Culmination', 'Culm_alt', 'SS_time', 'SS_dir']
s.head()
  Date SR_time SR_dir Culmination Culm_alt SS_time SS_dir
0 1 06:41 110.6 11:55 37.3 17:08 249.6
1 2 06:40 110.2 11:55 37.6 17:09 249.9
2 3 06:40 109.9 11:55 37.9 17:10 250.3
3 4 06:39 109.5 11:55 38.2 17:12 250.7
4 5 06:38 109.1 11:55 38.5 17:13 251.0

 

まとめ

 国陸天文台の『日の出入り』ページのデータを Beautiful Soup でお借りして、Numpy、Pandas で整えるところまで到達しました。

 こちらを使わせて頂き、視覚化、時系列化等、いろいろ学ばせて頂こうと思案中です。

 

 今年の恵方は「南南東」だそうです。家族が買ってきた恵方巻のラベルを見て驚いたのですが、「清水寺祈祷済」と書いてありました。恵方巻は、おいしいだけでなく、実は(?)、神聖な習慣なのでしょうか…。

 本日も最後までお付き合い、どうもありがとうございました。