ふくふくHukuhuku Inc.
EP.26Data Fetch 9分公開: 2026-09-02

電力需給データを取る ── 30分ごとに動く公的データ

年次の統計と違い、電力の需給は30分ごとに記録されます。気温や経済活動と強く連動するので、他のデータに重ねる素材として使いやすい部類です。

#電力#オープンデータ#Python
執筆 / 監修
松尾 亮合同会社ふくふく 代表社員

データ基盤・データパイプライン構築 / BI / 生成 AI 活用支援を専門とするエンジニア (28 年)。 本記事は AI 利用ポリシーに基づき、生成 AI の補助で執筆 → 人間が監修・編集して公開しています。

プロフィール詳細
シェア

公的なデータというと年次や月次のものを思い浮かべますが、は違います。各電力会社が管内の実績を、30分または1時間ごとに公開しています。粒度が細かいので、他のデータに重ねる素材として扱いやすい部類です。

取得はではなくのダウンロードが中心です。電力の使用量は、気温と強く連動します。夏の猛暑日と冬の寒波で跳ね上がり、春秋は落ち着く。加えて曜日の影響も大きく、平日と休日ではっきり差が出ます。外部要因が読みやすいデータなので、分析の練習にも向いています。

会社ごとにファイルが分かれている

取得で最初に当たるのが、電力会社ごとに配信の形が違うという点です。全国分をまとめて配信している場所は限られており、多くは各社が個別に を置いています。列名も、時刻の刻み方も、単位も揃っていません。

これは EP.20 で扱った取引所ごとの差と同じ構図です。差を吸収する層を作って、下流からは同じ形に見せるのが定石になります。会社が増えても、対応表に1行足すだけで済みます。

会社ごとの列名の差を、対応表で吸収する
Python
import pandas as pd
# 会社ごとに列名が違う。ここに閉じ込めて、下流には同じ形で渡すCOLUMN_MAP = {    "company_a": {"DATE": "date", "TIME": "time", "実績(万kW)": "demand_10k_kw"},    "company_b": {"日付": "date", "時刻": "time", "使用実績": "demand_10k_kw"},}

def normalize(df: pd.DataFrame, company: str) -> pd.DataFrame:    mapping = COLUMN_MAP[company]    missing = set(mapping) - set(df.columns)    if missing:        raise KeyError(f"{company} に想定した列が無い: {missing}。配信形式が変わった可能性")
    out = df.rename(columns=mapping)[list(mapping.values())].copy()    out["company"] = company    return out
単位が「万kW」であることが多い

日本の電力データは 万キロワット を単位にしていることがよくあります。会社によって単位が違う場合、揃えずに合計すると1万倍ずれます。列名に単位を含めておくと、後から見たときに気づけます。

24時と0時、そして時刻の重複

時刻の表記にも癖があります。1日の終わりを 24:00 と書く形式があり、標準的な日時として解釈しようとすると失敗します。前日の 24:00 は翌日の 0:00 なので、日付を1日進めて変換する必要があります。

また、30分刻みのデータでは1日48件が基本ですが、年に2回だけ件数が変わる地域があります。夏時間の切り替えがある国のデータを扱う場合、1日が46件や50件になります。件数を48で固定して検査すると、その日だけ誤検知します。

24:00 表記を、翌日の 0:00 として解釈する
Python
from datetime import datetime, timedelta
import pandas as pd

def parse_hour24(date_str: str, time_str: str) -> datetime:    """24:00 を翌日 0:00 として扱う。素直に解釈すると例外になる。"""    time_str = time_str.strip()    if time_str.startswith("24:"):        base = datetime.strptime(date_str, "%Y/%m/%d") + timedelta(days=1)        rest = time_str.split(":", 1)[1]        return datetime.strptime(f"{base:%Y/%m/%d} 0:{rest}", "%Y/%m/%d %H:%M")    return datetime.strptime(f"{date_str} {time_str}", "%Y/%m/%d %H:%M")

def check_daily_count(df: pd.DataFrame, expected: int = 48) -> pd.Series:    """1日あたりの件数を数える。48 以外の日を洗い出す。"""    counts = df.groupby(df["datetime"].dt.date).size()    return counts[counts != expected]

過去分は消えることがある

配信されている期間には限りがあります。直近1年ぶんだけを置いていて、古いファイルは順に消えていく、という運用は珍しくありません。必要になってから取りに行っても、もう無いという事態が起こります。

これは EP.05 で扱った「取り直せないデータ」に当たります。使う予定が決まっていなくても、取り始めた時点から生のまま貯めておく価値があります。量は年間でも数十メガバイト程度に収まります。

貯めるときは日付でしておくと、後から範囲を絞って読めます。時刻の扱いは を付けた状態で統一しておいてください。会社ごとにファイルを分けて取るので、結合する段になって時刻がずれていると気づくのでは遅すぎます。

重ねる相手を選ぶ

電力需給は他のデータと重ねてこそ意味が出ます。気温と重ねれば需要の説明になり、経済活動の指標と重ねれば景気の代理指標として使えます。粒度が細かいので、相手に合わせて粗くすることになります。

で時刻を索引にして粗くするのが素直です。粗くするときは、合計なのか平均なのか最大値なのかを目的で選んでください。1日の電力需要を代表させるなら、合計より最大値のほうが実態を表すことがあります。ピークがどこまで上がったかが、設備の観点では重要だからです。

気象データとの重ね合わせについては データの宝石箱 EP.03 が参考になります。次回は、公的データ全般に共通する「数字が後から変わる」問題を扱います。

電力のデータは、公的なオープンデータの中では珍しく粒度が細かく、しかも毎日更新されます。取得の練習台としても、実際の分析素材としても扱いやすい部類です。

シェア

この記事の感想を教えてください

あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。

シリーズの外も探す:

まずは、現状を聞かせてください。

要件が固まっていなくて大丈夫です。現状診断と方針提案までを無料でお手伝いします。

無料相談フォームへ hello [at] hukuhuku [dot] co [dot] jp