Last updated: 2025/10/17
雷雲と雷の関連性を解析するとき、-10^\circC や-20^\circC の高度が非常に大事です。気象庁のホームページからこのデータを見ることができます。例えば、2022年11月22日9時のデータは以下のリンクにあります:
https://www.data.jma.go.jp/stats/etrn/upper/view/daily_uth.php?year=2022&month=11&day=22&hour=9&atm=&point=47600&view=
このページを見ると、高度4032mの温度は-8.8^\circC、高度4379mの温度は-11.3^\circC、ということが分かります。これで-10^\circCの高度が推定できます。同じように他の温度の高度も推定できます。
でも、一つ一つのデータを計算するのが非常に手間がかかります。以下のプログラムは、任意の時刻における任意の温度の高度を自動的に計算することができます。
気象庁のサイトの変更で以下のプログラムで正しい値を取得できないこともあるので、プログラムの結果が正しいか一度気象庁のサイトと照らし合わせて確認してください。間違った結果が出力されたら連絡してください。
import requests
strDate = '20221122' # YYYYMMDD
strHour = '9' # '9' or '21' (JST)
siteCode = '47600' #Wajima
tarTempVal = -10 #Temperature
response = requests.get('https://www.data.jma.go.jp/stats/etrn/upper/view/daily_uth.php?year='+
strDate[0:4]+'&month='+str(int(strDate[4:6]))+'&day='+
str(int(strDate[6:8]))+'&hour='+strHour+'&atm=&point='+siteCode+'&view=')
data = response.text
strLineMat = data.split('\n')
lowHeight = 0
lowTemp = 100
for strLine in strLineMat:
if 'data_0_0' in strLine:
index1 = strLine.find('</td><td class=')
if index1<0:
continue
begIndex1 = index1+26
index2 = strLine.find('</td><td class=', begIndex1)
heightVal = int(strLine[begIndex1:index2])
begIndex2 = index2+26
index3 = strLine.find('</td><td class=', begIndex2)
tempVal = float(strLine[begIndex2:index3])
upHeight = lowHeight
upTemp = lowTemp
lowHeight = heightVal
lowTemp = tempVal
if lowTemp<tarTempVal:
break
if lowTemp==100:
print('No data.')
else:
tarHeight = (lowHeight-upHeight)/(upTemp-lowTemp)*(upTemp-tarTempVal)+upHeight
print(tarHeight)import requests
strDate = '20221122' # YYYYMMDD
strHour = '9' # '9' or '21' (JST)
siteCode = '47600' #Wajima
tarTempVal = -10 #Temperature
response = requests.get('https://www.data.jma.go.jp/stats/etrn/upper/view/daily_uth.php?year='+
strDate[0:4]+'&month='+str(int(strDate[4:6]))+'&day='+
str(int(strDate[6:8]))+'&hour='+strHour+'&atm=&point='+siteCode+'&view=')
data = response.text
strLineMat = data.split('\n')
lowHeight = 0
lowTemp = 100
for strLine in strLineMat:
if 'data_0_0' in strLine:
index1 = strLine.find('</td><td class=')
if index1<0:
continue
begIndex1 = index1+26
index2 = strLine.find('</td><td class=', begIndex1)
heightVal = int(strLine[begIndex1:index2])
begIndex2 = index2+26
index3 = strLine.find('</td><td class=', begIndex2)
tempVal = float(strLine[begIndex2:index3])
upHeight = lowHeight
upTemp = lowTemp
lowHeight = heightVal
lowTemp = tempVal
if lowTemp<tarTempVal:
break
if lowTemp==100:
print('No data.')
else:
tarHeight = (lowHeight-upHeight)/(upTemp-lowTemp)*(upTemp-tarTempVal)+upHeight
print(tarHeight)実行すると、-10^\circCの高度が約4199mという結果が分かります。
以上のプログラムを利用して、複数の日にちのデータを一括でダウンロードすることが簡単にできます。以下のプログラムは2021年11月から2022年12月のすべての-10^\circCの高度結果をダウンロードして、行8に指定されたフォルダーに保存します(一ヶ月の結果は一つのファイルに保存されます)。
import os
import requests
import datetime
import time
startMonth = '202111'
endMonth = '202112'
downloadDir = 'E:/Data/'
tarTempVal = -10 #Temperature
strHourMat = ['9', '21'] #Do not change
siteCode = '47600' #Wajima
if os.path.exists(downloadDir)==False:
os.mkdir(downloadDir)
startDate = startMonth+'01'
endMonthPlus = int(endMonth[4:6])+1
if endMonthPlus>12:
endDate = str(int(endMonth[0:4])+1)+'0101'
else:
endDate = endMonth[0:4]+str(endMonthPlus).zfill(2)+'01'
startSec = int(time.mktime(datetime.datetime.strptime(startDate, '%Y%m%d').timetuple()))
endSec = int(time.mktime(datetime.datetime.strptime(endDate, '%Y%m%d').timetuple()))
for curSec in range(startSec, endSec, 86400):
curDate = datetime.datetime.fromtimestamp(curSec).strftime('%Y%m%d')
print('Downloading '+curDate)
for strHour in strHourMat:
response = requests.get('https://www.data.jma.go.jp/stats/etrn/upper/view/daily_uth.php?year='+
curDate[0:4]+'&month='+str(int(curDate[4:6]))+'&day='+
str(int(curDate[6:8]))+'&hour='+strHour+'&atm=&point='+siteCode+'&view=')
data = response.text
strLineMat = data.split('\n')
lowHeight = 0
lowTemp = 100
for strLine in strLineMat:
if 'data_0_0' in strLine:
index1 = strLine.find('</td><td class=')
if index1<0:
continue
begIndex1 = index1+26
index2 = strLine.find('</td><td class=', begIndex1)
heightVal = int(strLine[begIndex1:index2])
begIndex2 = index2+26
index3 = strLine.find('</td><td class=', begIndex2)
tempVal = float(strLine[begIndex2:index3])
upHeight = lowHeight
upTemp = lowTemp
lowHeight = heightVal
lowTemp = tempVal
if lowTemp<tarTempVal:
break
if lowTemp==100:
print(strHour+': No data.')
continue
else:
tarHeight = (lowHeight-upHeight)/(upTemp-lowTemp)*(upTemp-tarTempVal)+upHeight
resFile = downloadDir+curDate[0:6]+'.txt'
if os.path.exists(resFile)==False:
fidRes = open(resFile, 'wt')
fidRes.write('date,hour,height\n')
fidRes.close()
fidRes = open(resFile, 'at')
fidRes.write(curDate[6:8]+','+strHour.zfill(2)+',%6.1f\n' % tarHeight)
fidRes.close()import os
import requests
import datetime
import time
startMonth = '202111'
endMonth = '202112'
downloadDir = 'E:/Data/'
tarTempVal = -10 #Temperature
strHourMat = ['9', '21'] #Do not change
siteCode = '47600' #Wajima
if os.path.exists(downloadDir)==False:
os.mkdir(downloadDir)
startDate = startMonth+'01'
endMonthPlus = int(endMonth[4:6])+1
if endMonthPlus>12:
endDate = str(int(endMonth[0:4])+1)+'0101'
else:
endDate = endMonth[0:4]+str(endMonthPlus).zfill(2)+'01'
startSec = int(time.mktime(datetime.datetime.strptime(startDate, '%Y%m%d').timetuple()))
endSec = int(time.mktime(datetime.datetime.strptime(endDate, '%Y%m%d').timetuple()))
for curSec in range(startSec, endSec, 86400):
curDate = datetime.datetime.fromtimestamp(curSec).strftime('%Y%m%d')
print('Downloading '+curDate)
for strHour in strHourMat:
response = requests.get('https://www.data.jma.go.jp/stats/etrn/upper/view/daily_uth.php?year='+
curDate[0:4]+'&month='+str(int(curDate[4:6]))+'&day='+
str(int(curDate[6:8]))+'&hour='+strHour+'&atm=&point='+siteCode+'&view=')
data = response.text
strLineMat = data.split('\n')
lowHeight = 0
lowTemp = 100
for strLine in strLineMat:
if 'data_0_0' in strLine:
index1 = strLine.find('</td><td class=')
if index1<0:
continue
begIndex1 = index1+26
index2 = strLine.find('</td><td class=', begIndex1)
heightVal = int(strLine[begIndex1:index2])
begIndex2 = index2+26
index3 = strLine.find('</td><td class=', begIndex2)
tempVal = float(strLine[begIndex2:index3])
upHeight = lowHeight
upTemp = lowTemp
lowHeight = heightVal
lowTemp = tempVal
if lowTemp<tarTempVal:
break
if lowTemp==100:
print(strHour+': No data.')
continue
else:
tarHeight = (lowHeight-upHeight)/(upTemp-lowTemp)*(upTemp-tarTempVal)+upHeight
resFile = downloadDir+curDate[0:6]+'.txt'
if os.path.exists(resFile)==False:
fidRes = open(resFile, 'wt')
fidRes.write('date,hour,height\n')
fidRes.close()
fidRes = open(resFile, 'at')
fidRes.write(curDate[6:8]+','+strHour.zfill(2)+',%6.1f\n' % tarHeight)
fidRes.close()以下のような結果がダウンロードされます:
202111.txt (2021年11月のデータ)
一列目は日にち、2列目は時間(9時か21時)、3列目は指定温度の高度(m)
date,hour,height
01,09,4316.8
01,21,4355.4
02,09,4231.2
02,21,3795.7
03,09,4241.0
03,21,3987.6
04,09,3639.4
04,21,3521.7
05,09,3673.0
05,21,4224.4
06,09,4080.1
06,21,4025.1
07,09,4513.1
07,21,5011.9
08,09,5235.5
08,21,5243.0
09,09,4972.0
09,21,4226.7
10,09,3249.5
10,21,3033.3
11,09,3392.7
11,21,3208.0
12,09,2735.0
12,21,3021.2
13,09,3977.0
13,21,4235.5
14,09,4009.4
14,21,3906.2
15,09,3948.4
15,21,4135.9
16,09,3517.1
16,21,3397.8
17,09,3571.0
17,21,3962.3
18,09,3623.0
18,21,4159.3
19,09,4385.2
19,21,4123.2
20,09,4149.5
20,21,4030.2
21,09,4380.7
21,21,4014.2
22,09,4732.1
22,21,2986.0
23,09,2544.1
23,21,2274.5
24,09,2171.4
24,21,2596.2
25,09,3049.3
25,21,2759.6
26,09,2436.6
26,21,2287.5
27,09,1966.5
27,21,2353.5
28,09,2626.8
28,21,4001.4
29,09,3896.1
29,21,3965.7
30,09,3904.6
30,21,4413.4
同じような方法で、気象庁の他のデータをダウンロードすることも簡単にできると思います。
Back to Python関連資料