こういうデータを pythonで扱うには、PANDS の read_csv を使うのが普通らしい。 CやFortranなら、1文字や1行単位で読んで、適宜処理するのだが、 read_csv は多機能なので、それに応じた使いこなしが必要である。
今回、1行目と3行目のデータをスキップするして、2行目をラベルにするので、 きっと
df = pd.read_csv("TOA5*****.dat", skiprows=[0.2])などと書くはず他の懸念事項として、ラベルになる項目名が "TIMESTAMP" のように " で囲まれている。
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)
ありがとうございます。あなたの現在のコードでは 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) 玉川のメモのページへ 玉川のサンプルプログラムのページ