Pythonで拡張アメダス新フォーマット(WEA2)を読む(2)
2024年1月11日
2024年11月6日
前回に続いて拡張アメダスWEA2の読み込みです。
ブロック番号とファイル上の位置
前回まとめたように、WEA2ファイル上のデータの位置はブロック番号で扱います。
1ブロックのサイズは201,366byte。図のようにブロック番号が分ればデータのファイル上の位置を特定することができます。
さらに、その位置から気温や湿度のデータを読み込む事ができます。
ブロックとレコード
各ブロックはデータの種類ごとの183,06byteのレコードから構成されます。
WEAとWEA2で構成が異なり、WEAでは8レコード、WEA2では11レコードで構成されています。図のようにWEA2では地点情報、気圧、相対湿度が増えています。
各レコードには24時間×366日分※、日平均366分のデータが格納されています。
※:拡張アメダスには標準年と実年データがあるため、うるう年を想定して366日分のデータで構成されているようです。標準年は、はじめの365日分を使用します。
レコードに格納されているデータの詳細は「2020年版EA気象データ」の資料を参照してください。
Pythonスクリプトの例
気温のデータを読み込むには地点ブロックの[1]のレコードを読み込みます。
以下の例では、最初のレコード([0]地点情報)を読み飛ばして、[1]気温のデータの読み込みとテキストファイルへの書き出しを行っています。
# coding: utf-8
# Example code to read the extended AMeDAS WEA2 file.
# author Yuichi Yasuda @ quattro corporate design
# copyright 2024 quattro corporate design. All right reserved.
import struct
import math
def read_int16(f):
"""Reads a 2-byte signed integer from the file"""
bytes = f.read(2)
val = struct.unpack('<h', bytes)[0] #Convert bytes to a 2-byte signed integer (int16)
return val
def remove_remark(val):
"""remove the remark"""
return math.floor(val/10.0) # round the value down
if(__name__ == '__main__'):
RECORD_LENGTH = 18306
BLOCK_LENGTH = RECORD_LENGTH * 11
weafile = r'E:\EAD\PRY1120.wea2'
# ブロック番号()内は地点番号
# block_no = 1 #宗谷(10)
block_no = 363 #東京(3630)
#block_no = 726 #福岡(7260)
tambs = [] #気温のリストを初期化する
# Open the file
with open(weafile, 'rb') as f:
# seek to the head of the specified station data.
f.seek((block_no-1)*BLOCK_LENGTH) # go to the head of the specified station data.
# [0]地点情報レコード
f.seek(RECORD_LENGTH,1) # Skip the first record, 18306 bytes
# [1]気温レコード
# read the station, entity no and the year
ea_number = read_int16(f)
entity_number = read_int16(f)
year = read_int16(f)
print('ea_number: ', ea_number)
print('entity_number: ', entity_number)
print('year: ', year)
print()
# read the data for 365 days
for day in range(366): #365 days + 1 day for dummy
for hour in range(24): #24 hours
val = read_int16(f)
val = remove_remark(val) #remove the remark
val = val * 1.0/10.0 #unit conversion, 0.1C to 1.0C
tambs.append(val)
# Skip 366-day daily average, 732 bytes
f.seek(732,1)
# Write the data to a csv file
print('気温をcsvファイルに書き出します。')
with open('tamb.csv', 'w') as f:
for val in tambs[:8760]: # data for 24 hour*365 days excluding the dummy day
f.write(str(val)+'\n')
ここまでできてしまえば、あとは同じ処理の繰り返しです。絶対湿度、全天日射量~相対湿度も同様にレコードごとに読み込むことができます。
2024/11/06 続きの記事を投稿しました。
動作環境
以下の環境で動作を確認しています。
- Windows11 Pro(64bit, 23H2)
- Python 3.11.4
- 標準年EA気象データ2020年版
2件のピンバック
Pythonで拡張アメダス新フォーマット(WEA2)を読む(1) | 建築環境工学系日記
Pythonで拡張アメダス新フォーマット(WEA2)を読む(3) | 建築環境工学系日記