Pythonで拡張アメダス新フォーマット(WEA2)を読む(2)

前回に続いて拡張アメダス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')

ここまでできてしまえば、あとは同じ処理の繰り返しです。絶対湿度、全天日射量~相対湿度も同様にレコードごとに読み込むことができます。

動作環境

以下の環境で動作を確認しています。

  • Windows11 Pro(64bit, 23H2)
  • Python 3.11.4
  • 標準年EA気象データ2020年版
Pocket

1件のピンバック

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です