日照時間で感じる季節の移り変わり - 2 -  2020 年の軽い EDA

 前回は、国立天文台の「日の出入り」データを Beautiful Soup でお借りし、それを numpy / pandas 形式で整えるところまでやりました。

 必要な日の出入りのデータをお借りすることはできるようになりましたが、そのたびにアクセスするのも先方に迷惑なので(?)、一年分まとめてお借りし、それを自分の computer に保存、その後いじくることとしました。

 

目次

1.2020 年一年分の日の出入りのデータをまとめて保存する

2.データの整形

3.簡単に見てみる

4.簡単に図示する

まとめ

 

1.2020 年一年分の日の出入りのデータをお借りし、保存する

 データをまとめ、保存する方針と形式(と言うほどのものではないのですが)は、次のようにしました。

① 2020 年を一つのフォルダへまとめる。

② サイトのページをそのまま保存するイメージ。つまり、ファイル数は月数。

③ 保存ファイル形式は、 csv 形式。

 前回は 1 ページ(つまり 1 か月分)のみ読み込むだけだったのですが、一年分まとめて読み込み、それを保存する、という形にしました。

import urllib.request
from bs4 import BeautifulSoup
import numpy as np
import pandas as pd
import os

yr = "2020"
mnths = ["01","02","03","04","05","06","07","08","09","10","11","12"]
dys = [31,29,31,30,31,30,31,31,30,31,30,31]  # 2020 only

def gather_srss(i):
mnth = mnths[i]
dy = dys[i]
target_url=
"https://eco.mtk.nao.ac.jp/koyomi/dni/"+yr+"/s13"+mnth+".html"

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

A = []
for srss in srsss:
a=srss.contents[0]
A.append(a)

B = np.array(A).reshape(dy,7)
for m in range(dy):
B[m,1] = B[m,1].replace(' ', '0')

s = pd.DataFrame(B)
s.columns=['Date', 'SR_time', 'SR_dir', 'Culmination',
'Culm_alt', 'SS_time', 'SS_dir']

os.chdir(r'C:\ 保存するフォルダ名 ')
s.to_csv(" ファイル名 "+yr+mnth+".csv")

for i in range(12):
gather_srss(i)

  

2.データの整形

 これで相手のサーバーに迷惑をかけることがなくなりました。

 保存したファイルを読み込み、一年分まとめてデータフレーム(df20)にします。そして、列ごとにデータの型式を揃え、ついでに、日照時間(Daylight_Hours)、太陽の移動角度(Travel_Angle)を付け加えました。

import os
import pandas as pd


os.chdir(r'C:\ 保存したフォルダ ')
yr = "2020"
mnths = ["01","02","03","04","05","06","07","08","09","10","11","12"]
df20 = pd.DataFrame()

def read_srss(k):
del df['Unnamed: 0']
df['Date'] = df['Date'].replace({' 1':'01', ' 2':'02',' 3':'03',
' 4':'04',' 5':'05', ' 6':'06',' 7':'07',
' 8':'08',' 9':'09'})
df['SR_time'] = yr+"/"+mnths[k]+"/"+df['Date']+" "+df['SR_time']
df['SS_time'] = yr+"/"+mnths[k]+"/"+df['Date']+" "+df['SS_time']
df['Culmination'] = yr+"/"+mnths[k]+"/"+df['Date']+
" "+df['Culmination']

for k in range(12):
df = pd.read_csv("SRSS"+yr+mnths[k]+".csv", dtype={'Date':str})
read_srss(k)
df20 = df20.append(df)

df20['SR_time'] = pd.to_datetime(df20['SR_time'])
df20['SS_time'] = pd.to_datetime(df20['SS_time'])
df20['Culmination'] = pd.to_datetime(df20['Culmination'])

df20['Daylight_Hours'] = df20['SS_time'] - df20['SR_time']
df20['Travel_Angle'] = df20['SS_dir'].astype('float64') - df20['SR_dir'].astype('float64')

df20.head()
  Date SR_time SR_dir Culmination Culm_alt SS_time SS_dir Daylight_Hours Travel_Angle
0 01 2020-01-01 06:50:00 118.1 2020-01-01 11:44:00 31.3 2020-01-01 16:38:00 241.9 0 days 09:48:00 123.8
1 02 2020-01-02 06:51:00 118.0 2020-01-02 11:45:00 31.4 2020-01-02 16:39:00 242.0 0 days 09:48:00 124.0
2 03 2020-01-03 06:51:00 117.9 2020-01-03 11:45:00 31.5 2020-01-03 16:40:00 242.1 0 days 09:49:00 124.2
3 04 2020-01-04 06:51:00 117.8 2020-01-04 11:46:00 31.6 2020-01-04 16:40:00 242.3 0 days 09:49:00 124.5
4 05 2020-01-05 06:51:00 117.7 2020-01-05 11:46:00 31.7 2020-01-05 16:41:00 242.4 0 days 09:50:00 124.7

 データフレーム自体は、前回から目新しさはありませんが、データ型は以下のようにしました。

df20.dtypes

Date                     object
SR_time                datetime64[ns]
SR_dir                   float64
Culmination         datetime64[ns]
Culm_alt               float64
SS_time                datetime64[ns]
SS_dir                   float64
Daylight_Hours    timedelta64[ns]
Travel_Angle        float64
dtype: object

 

3.簡単に見てみる

  jupyter notebook のセルでは、それほど長いと感じなかったのですが、ブログにコピペすると、なかなか長いですね。ということで、さっそく 2020 年の日の出入りのデータをざっくり見てみることとします。

df20.describe()
  SR_dir Culm_alt SS_dir Daylight_Hours Travel_Angle
count 366.000000 366.000000 366.000000 366 366.000000
mean 88.934699 54.686612 271.067486 0 days 12:10:55.573770491 182.132787
std 20.536070 16.482305 20.537343 0 days 01:40:01.575416347 41.073001
min 60.000000 30.900000 241.400000 0 days 09:45:00 122.800000
25% 68.725000 38.375000 250.850000 0 days 10:33:30 141.575000
50% 88.600000 55.000000 271.450000 0 days 12:12:30 182.850000
75% 109.150000 70.975000 291.325000 0 days 13:47:45 222.550000
max 118.600000 77.800000 300.000000 0 days 14:35:00

240.000000

 

 

 簡単に見るだけのつもりが、これだけでほぼすべてが語られていました。

 東京の緯度は、北緯 35°41' であることを念頭に見てみると。

① 2020 年は 366 日で、

② 一年平均すると、太陽はほぼ真東 (北から 88.9° の位置) から昇り、真西 (271°) に沈み(要するに、春分秋分の日辺り)、

春分秋分時の南中高度 (Culm_alt) は 54.6°(90° ー 東京の北緯 35°41')で、

④ 日中の時間は 12 時間 10 分。

⑤ 南中高度が最大になるのは(おそらく夏至の時で)、77.8° (90°ー(東京の北緯ー北回帰線 23.4°))

⑥ 南中高度が最小になるのは(おそらく冬至の時で)、30.9° (90°ー(東京の北緯+北回帰線 23.4°))

 まさに教科書通りというか、あるいは、教科書が過不足なく言い表しているというべきでしょうか。

 

4.簡単に図示する

describe() だけでも十分のような気もしますが、とどめにいくつか図示してみました。

f:id:ohigehige:20210206230844p:plain

 左から、一年を通じた南中高度の変化、日照時間と年中高度の関係、日照時間と太陽の移動角度の関係を図示しました。ここまできれいに精度よく記述できるからこそ、今年の節分のように、補正も精確にできるのでしょうね。

 

まとめ

 日の出入りに関しては、怖ろしい精度で記述が可能であることが窺えました。また、データを整えさえすれば、あっという間にまとめてくれる、python やそのライブラリにもびっくりです。

 日照時間の変化は、十分過ぎる位感じることができましたが、これに天気などのデータを加えると、季節の移り変わりを感じることとなるのでしょうか…。おいおい試してみたいと思います。

 

 今日は、寒さが緩んだというよりも、暖かい一日でした。2 月の第一週目で最高気温が 16 ℃位になるのは驚きです。

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