Python で励磁突入電流を解析する:瞬時値・60Hz 実効値・FFT・DC 成分をまとめて可視化する方法
電力系統の解析では、三相電流の瞬時値だけでなく、60 Hz 実効値(RMS) や DC 成分(直流オフセット)、さらに 周波数スペクトル(FFT) を確認することが重要である。
本記事では、Python(pandas / matplotlib / NumPy)を用いて、
- 三相電流 ia, ib, ic の瞬時値
- 60 Hz の 1 周期 RMS
- 零相電流 i0 = ia + ib + ic
- FFT による DC 成分・60 Hz 成分の抽出
- グラフの PNG 保存
までを一括で行う解析コードを解説する。
解析コードの全体構成
本記事で扱うコードは、以下の 5 つの処理で構成されている。
- CSV データの読み込みと整形
- 60 Hz 実効値(RMS)の計算
- FFT による周波数解析
- DC 成分(平均値)の算出
- 4 段グラフ(ia / ib / ic / i0)の描画と保存
- FFT グラフの描画と保存
解析対象の CSV は以下の列を持つことを想定している。
- t(秒)
- i(SwCB_a)
- i(SwCB_b)
- i(SwCB_c)
t,i(SwCB_a),i(SwCB_b),i(SwCB_c)
0,0,0,0
0.0001,-6.27238227751644E-05,-0.000476417815174878,0.00053913563838831
0.0002,-8.08975681498594E-05,-0.000485468856170683,0.000566309647482591
0.0003,-4.92502409424707E-05,-0.000493972095036829,0.000543016241371062
0.0004,-1.64779107705474E-05,-0.000501815195642578,0.00051812537473591
CSV データの読み込みと前処理
まずは CSV を読み込み、秒 → ミリ秒変換、列名整理、零相電流 i0 の生成を行う。
ポイントは以下の通りである。
- t は秒で記録されているため、ミリ秒に変換する
- 列名を ia, ib, ic に統一する
- i0 = ia + ib + ic を新たに作成する
def load_data(file_path: str, usecols: list, encoding: str = 'utf-8') -> pd.DataFrame:
df = pd.read_csv(file_path, usecols=usecols, encoding=encoding)
# 秒 → ミリ秒変換
df["t"] *= 1000
# 列名整理
df["ia"] = df["i(SwCB_a)"]
df["ib"] = df["i(SwCB_b)"]
df["ic"] = df["i(SwCB_c)"]
df["i0"] = df["ia"] + df["ib"] + df["ic"]
return df
60 Hz 実効値(RMS)の計算方法
電力系統の実効値は 1/60 秒(約 16.6667 ms) の窓幅で計算する。
本コードでは、
- サンプリング周期 dt を t 列から自動推定
- 窓幅(ms)をサンプル数に変換
- rolling().mean() を用いて RMS を算出
という流れで RMS を求めている。
def compute_rms(series: pd.Series, t: pd.Series, window_ms: float) -> pd.Series:
dt = t.diff().median() # サンプリング周期(ms)
window_samples = int(window_ms / dt)
if window_samples < 1:
window_samples = 1
return series.pow(2).rolling(window_samples).mean().apply(np.sqrt)
FFT による周波数解析
FFT(高速フーリエ変換)を用いて、以下の成分を抽出する。
- DC 成分(0 Hz)
- 基本波(60 Hz)
- 高調波(120 Hz, 180 Hz, …)
FFT のポイントは以下である。
- サンプリング周期 dt からサンプリング周波数 fs を計算
- NumPy の
np.fft.fft()を使用 - 片側振幅スペクトルに変換(実効的な振幅を得るため)
- ±1 Hz の範囲で最大値を抽出し、60 Hz 成分を求める
def compute_fft(series: pd.Series, t: pd.Series):
"""FFT を計算し、周波数軸と片側振幅スペクトルを返す"""
# サンプリング周期(秒)
dt_sec = (t.diff().median()) / 1000.0
fs = 1.0 / dt_sec # サンプリング周波数
N = len(series)
fft_vals = np.fft.fft(series - np.mean(series)) # DC 成分を除去してもよい
fft_vals = np.abs(fft_vals) / N * 2 # 片側振幅に変換
freqs = np.fft.fftfreq(N, d=dt_sec)
mask = freqs >= 0 # 片側のみ
return freqs[mask], fft_vals[mask], fs
DC 成分(平均値)の算出
突入電流では、非対称成分(DC オフセット) が重要である。
FFT の 0 Hz 成分でも DC を推定できるが、 最もシンプルで正確なのは 時系列データの平均値 である。
本コードでは以下のように DC 成分を算出している。
dc_value = df[col].mean()
4 段グラフで瞬時値と RMS を可視化
本コードでは、以下の 4 段構成でグラフを描画する。
- ia(瞬時値+RMS)
- ib(瞬時値+RMS)
- ic(瞬時値+RMS)
- i0(瞬時値+RMS+DC 成分の水平線)
RMS は赤の太線、瞬時値は青の半透明線で描画しているため、 突入電流の立ち上がりや DC 成分の影響が視覚的にわかりやすい。

FFT グラフ
i0 の FFT スペクトルを PNG 形式で保存する。
- 0〜500 Hz の範囲を表示
- DC 成分、60 Hz 成分、高調波が視覚的に確認できる

まとめ
本記事では、Python を用いて突入電流の解析を行う方法を紹介した。
- 三相電流の瞬時値と RMS を可視化
- 零相電流 i0 の DC 成分を算出
- FFT により 60 Hz 成分や高調波を抽出
- グラフを PNG 形式で保存
電験・電力解析・保護協調・変圧器の励磁突入電流の評価など、 幅広い用途で活用できる。

