IRGASON のデータを読む Python コード (CR1000, TOA5)

研究室にある超音波風速温度計+ガスアナライザ IRGASON のデータは Cmpbell Sci. の CR1000 ロガーで記録されており、データは dat という拡張子のファイルである。形式は TOA5 とのことで テキストで書かれたCSVファイルである。

こういうデータを pythonで扱うには、PANDS の read_csv を使うのが普通らしい。 CやFortranなら、1文字や1行単位で読んで、適宜処理するのだが、 read_csv は多機能なので、それに応じた使いこなしが必要である。

今回、1行目と3行目のデータをスキップするして、2行目をラベルにするので、 きっと

df = pd.read_csv("TOA5*****.dat", skiprows=[0.2])などと書くはず
他の懸念事項として、ラベルになる項目名が "TIMESTAMP" のように " で囲まれている。

現状 (2025.6.12)

mport os
import pandas as pd

# 対象ディレクトリのパス
# directory = '../DATA'  # 実際のパスに置き換えてください
directory = './'  # 実際のパスに置き換えてください

# ファイル一覧を取得し、"202309" を含むファイルだけ処理
for filename in os.listdir(directory):
    print('|'+filename+'|')
    if (("2023_09" in filename) and ("IRGA" in filename) and filename.endswith('.dat')):
        print('FILENAME='+filename+"filename")
# ファイルパスを指定
#        print('TRUE ' + filename)
        file_path = os.path.join(directory, filename)

        try:
# TOA5形式ではヘッダーが数行あるので、適切にスキップする必要があります
# 通常、データは4行目から始まることが多い(ヘッダーが3行)
#  
            df = pd.read_csv(
            file_path,
            skiprows=[0,2,3],  # ヘッダー行数に応じて調整
            parse_dates=[r'TIMESTAMP'],  # 日時列の名前が'TIMESTAMP'であることが
多い
            index_col='TIMESTAMP',  # 日時をインデックスに設定


まだまだ。

2025.6.13 Copilot にも聞きながら、作ったものがこれ

import os
import pandas as pd

def load_and_clean_csv(file_path):
    """CSVファイルを読み込み、整形して返す"""
    df = pd.read_csv(
        file_path,
        skiprows=[0, 2, 3],  # ヘッダー行をスキップ
        parse_dates=['TIMESTAMP'],
        index_col='TIMESTAMP',
        na_values=['NAN']
    )
    df.columns = df.columns.astype(str).str.replace('"', '')  # カラム名のクリーンアップ
    return df

def process_directory(directory):
    """指定ディレクトリ内の対象ファイルを読み込み、結合して返す"""
    combined_df = pd.DataFrame()
    for filename in os.listdir(directory):
        if "2023_09" in filename and "IRGA" in filename and filename.endswith('.dat'):
            file_path = os.path.join(directory, filename)
            print(f"読み込み中: {filename}")
            try:
                df = load_and_clean_csv(file_path)
                combined_df = pd.concat([combined_df, df])
                print(f"現在のデータサイズ: {combined_df.shape}")
            except Exception as e:
                print(f"エラー({filename}): {e}")
    return combined_df

# 実行部分
directory = '../DATA'  # 必要に応じて変更
df = process_directory(directory)

print("読み込み完了")
print(f"結合前: {df.shape}")

df_cleaned = df.drop_duplicates()
print("重複削除後")
print(f"結合後: {df_cleaned.shape}")

結局なんか読んで、1つの dataframe に格納できた。 5分平均値と標準偏差を計算して、dateframe に格納して CSVファイルに出力するようにcopilot に依頼したら、今のが出てきた。
import os
import pandas as pd

def load_and_clean_csv(file_path):
    """CSVファイルを読み込み、整形して返す"""
    df = pd.read_csv(
        file_path,
        skiprows=[0, 2, 3],  # ヘッダー行をスキップ
        parse_dates=['TIMESTAMP'],
        index_col='TIMESTAMP',
        na_values=['NAN']
    )
    df.columns = df.columns.astype(str).str.replace('"', '')  # カラム名のクリーンアップ
    return df

def process_directory(directory):
    """指定ディレクトリ内の対象ファイルを読み込み、結合して返す"""
    combined_df = pd.DataFrame()
    for filename in os.listdir(directory):
        if "2023_09" in filename and "IRGA" in filename and filename.endswith('.dat'):
            file_path = os.path.join(directory, filename)
            print(f"読み込み中: {filename}")
            try:
                df = load_and_clean_csv(file_path)
                combined_df = pd.concat([combined_df, df])
                print(f"現在のデータサイズ: {combined_df.shape}")
            except Exception as e:
                print(f"エラー({filename}): {e}")
    return combined_df

def calculate_statistics(df):
    """5分ごとの平均値と標準偏差を計算"""
    df_resampled = df.resample('5T').agg(['mean', 'std'])  # 5分ごとの集約
    return df_resampled

# 実行部分
directory = '../DATA/'  # 必要に応じて変更

df = process_directory(directory)

print("読み込み完了")
print(f"結合前: {df.shape}")

df_cleaned = df.drop_duplicates()
print("重複削除後")
print(f"結合後: {df_cleaned.shape}")

df_stats = calculate_statistics(df_cleaned)

# CSVファイルに出力
output_path = os.path.join(directory, 'processed_data.csv')
df_stats.to_csv(output_path)

print(f"処理完了: {output_path}")

これでいいのだろうか、来週確認 (2026.6.13)

残ったエラーを、こんどは ChatCPT (フリー版)に聞いてみた。

とりあえず、応答がかなり早い。岐阜大学の状況かもしれないが、MSの各サービスが全部とても遅い。
ChatGPT によると、
ありがとうございます。あなたの現在のコードでは parse_dates=['TIMESTAMP'] を使って日付の自動解析を行っていますが、TIMESTAMP列の小数秒の桁数が不定なため、エラーになります。

以下のように修正することで、安全に読み込みと変換ができます:
✅ 修正後の load_and_clean_csv 関数(推奨)

import pandas as pd

def load_and_clean_csv(file_path):
    """CSVファイルを読み込み、整形して返す"""
    # 先に日付を文字列として読み込む
    df = pd.read_csv(
        file_path,
        skiprows=[0, 2, 3],  # ヘッダー行をスキップ
        na_values=['NAN']
    )

    # TIMESTAMP列を datetime 型に変換(小数秒の桁数に柔軟対応)
    df['TIMESTAMP'] = pd.to_datetime(df['TIMESTAMP'], errors='coerce')

    # インデックスに設定
    df = df.set_index('TIMESTAMP')

    # 必要ならカラム名のクリーンアップも復活可能(コメント解除して使う)
    # df.columns = df.columns.astype(str).str.replace('"', '')

    return df
ということ、「時間が秒以下の単位のとき、桁数が変わるデータがあるとおかしくなるっぽい」自動で読み込むのに不思議な振る舞いになっている模様。 そこを直したら、エラーなく動いた。
import os
import pandas as pd

def load_and_clean_csv(file_path):
    """CSVファイルを読み込み、整形して返す"""
    df = pd.read_csv(
        file_path,
        skiprows=[0, 2, 3],  # ヘッダー行をスキップ
#        parse_dates=['TIMESTAMP'],
#        index_col='TIMESTAMP',
        na_values=['NAN']
    )

#    df.columns = df.columns.astype(str).str.replace('"', '')  # カラム名のクリーンアップ
    # TIMESTAMP列を datetime 型に変換(小数秒の桁数に柔軟対応)
    df['TIMESTAMP'] = pd.to_datetime(df['TIMESTAMP'], errors='coerce')

    # インデックスに設定
    df = df.set_index('TIMESTAMP')

    return df

def process_directory(directory):
    """指定ディレクトリ内の対象ファイルを読み込み、結合して返す"""
    combined_df = pd.DataFrame()
    for filename in os.listdir(directory):
        if "2023_09" in filename and "IRGA" in filename and filename.endswith('.dat'):
            file_path = os.path.join(directory, filename)
            print(f"読み込み中: {filename}")
            try:
                df = load_and_clean_csv(file_path)
                combined_df = pd.concat([combined_df, df])
                print(f"現在のデータサイズ: {combined_df.shape}")
            except Exception as e:
                print(f"エラー({filename}): {e}")
    if not combined_df.empty:
        combined_df.index = pd.to_datetime(combined_df.index)

    return combined_df

def calculate_statistics(df):
    """5分ごとの平均値と標準偏差を計算"""
    df_resampled = df.resample('5min').agg(['mean', 'std'])  # 5分ごとの集約
    return df_resampled

# 実行部分
directory = '../DATA/'  # 必要に応じて変更

df = process_directory(directory)

print("読み込み完了")
print(f"結合前: {df.shape}")

df_cleaned = df.drop_duplicates()
print("重複削除後")
print(f"結合後: {df_cleaned.shape}")

df_stats = calculate_statistics(df_cleaned)

# CSVファイルに出力
output_path = os.path.join(directory, 'processed_data.csv')
df_stats.to_csv(output_path)

print(f"処理完了: {output_path}")
まだまだ、実用には遠い感じ。Python は情報は多いけど、 見通しが良くないなぁと感じています。この処理に AI が良さそうです。 ChatGPT は Copilot よりもずっと早く答えを返してくれる気がします。 大学のアカウントでやってるから?環境次第かもしれません。うまく使えば 役に立ちそうです。 (2025.6.24) 玉川のメモのページへ   玉川のサンプルプログラムのページ