こういうデータを 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) 玉川のメモのページへ 玉川のサンプルプログラムのページ