自動車・データ実務

自動車試験データを km/h、m/s、g、m/s² の間で変換する

合成の車速と加速度データを一貫した SI 単位へ変換し、その結果を元の単位へ戻して計算を確認します。スクリプトは元の CSV を保持し、変換後の値を新しい出力フォルダに書き出します。

目次を表示

この翻訳はAIで作成しました。コード、単位、数値は原文と併せて確認してください。各言語のネイティブ話者による校閲は、まだ完了していません。 English

対象読者速度と加速度の単位が混在する車両データや試験データを扱い、解析前に簡単な単位変換チェックを行いたい人向けのガイドです。

準備するもの
  • Python 3.12 と、そのバージョンを起動できるターミナルコマンド。
  • UTF-8 CSV と Python ファイルを保存できるテキストエディタ。
  • スクリプトが outputs の下に新しいフォルダを作成できる作業フォルダ。
  • 必要なのは Python 標準ライブラリのみです: csv, math, pathlib.

01データを触る前に変換規則を書く

この例では、速度を metres per second、加速度を metres per second squared に標準化します。速度変換は 1 kilometre = 1000 metres、1 hour = 3600 seconds に基づくため、km/h を 3.6 で割ると m/s になります。逆変換では m/s に 3.6 を掛けます。

加速度について、このチュートリアルでは conventional standard gravity value g0 = 9.80665 m/s² を使用します。g で表された値に 9.80665 を掛けると m/s² になります。逆変換では m/s² を 9.80665 で割ります。

変換規則
km/h to m/skm/h ÷ 3.6
m/s to km/hm/s × 3.6
g to m/s²g × 9.80665
m/s² to gm/s² ÷ 9.80665

02小さな合成試験データセットを作成する

以下の dataset は合成データであり、この記事のために作成したものです。unit_test_data.csv として保存してください。速度変換を手作業で確認しやすくしつつ、加速度例には正、負、小数の g values が含まれるよう値を選んでいます。

csv
sample_id,speed_kmh,accel_g
T001,0,0
T002,36,1
T003,72,-0.5
T004,90,0.25
T005,108,-1.25

レコードは5件あります。negative acceleration values は負のまま保持されます。変換で変わるのは単位であり、符号ではありません。この dataset は数値例にすぎず、特定の vehicle manoeuvre や sensor を表すことを目的としていません。

03想定値を手作業で計算する

速度変換は直接計算できます。たとえば、72 km/h ÷ 3.6 = 20 m/s、90 km/h ÷ 3.6 = 25 m/s です。元に戻すと、20 × 3.6 = 72 km/h、25 × 3.6 = 90 km/h になります。

加速度では、1 g は 9.80665 m/s² になります。-0.5 g は -4.903325 m/s²、0.25 g は 2.4516625 m/s²、-1.25 g は -12.2583125 m/s² になります。

sample_idspeed_kmh想定 speed_m_saccel_g想定 accel_m_s2
T00100.00000000.000000
T0023610.00000019.806650
T0037220.000000-0.5-4.903325
T0049025.0000000.252.451663
T00510830.000000-1.25-12.258313

表示される acceleration values は小数点以下6桁に丸めています。計算自体では、すでに丸めた output text を繰り返し使用せず、完全な 9.80665 factor を使用してください。

04CSV を変換して round-trip check を行う

次のスクリプトを unit_conversion_check.py として保存してください。元の values を読み取り、両方の forward conversions を実行し、結果を元の units に戻して、小さな numerical tolerance で round trip を確認します。元の CSV は書き換えません。

python
import csv
import math
from pathlib import Path

SOURCE = Path("unit_test_data.csv")
OUTPUT_DIR = Path("outputs") / "unit_conversion_result"
OUTPUT = OUTPUT_DIR / "converted_test_data.csv"
STANDARD_GRAVITY = 9.80665
TOLERANCE = 1e-12


def kmh_to_ms(value: float) -> float:
    return value / 3.6


def ms_to_kmh(value: float) -> float:
    return value * 3.6


def g_to_ms2(value: float) -> float:
    return value * STANDARD_GRAVITY


def ms2_to_g(value: float) -> float:
    return value / STANDARD_GRAVITY


def main() -> None:
    if not SOURCE.is_file():
        raise FileNotFoundError(f"Source CSV not found: {SOURCE}")
    if OUTPUT_DIR.exists():
        raise FileExistsError(f"Output folder already exists: {OUTPUT_DIR}")

    output_rows = []
    with SOURCE.open("r", encoding="utf-8-sig", newline="") as stream:
        reader = csv.DictReader(stream)
        required = {"sample_id", "speed_kmh", "accel_g"}
        if reader.fieldnames is None or not required.issubset(reader.fieldnames):
            raise ValueError("CSV is missing a required column.")

        seen_ids = set()
        for row in reader:
            sample_id = row["sample_id"].strip()
            if not sample_id:
                raise ValueError("sample_id must not be blank.")
            if sample_id in seen_ids:
                raise ValueError(f"Duplicate sample_id: {sample_id}")
            seen_ids.add(sample_id)

            speed_kmh = float(row["speed_kmh"])
            accel_g = float(row["accel_g"])
            speed_ms = kmh_to_ms(speed_kmh)
            accel_ms2 = g_to_ms2(accel_g)
            speed_roundtrip = ms_to_kmh(speed_ms)
            accel_roundtrip = ms2_to_g(accel_ms2)

            speed_ok = math.isclose(
                speed_kmh, speed_roundtrip,
                rel_tol=TOLERANCE, abs_tol=TOLERANCE
            )
            accel_ok = math.isclose(
                accel_g, accel_roundtrip,
                rel_tol=TOLERANCE, abs_tol=TOLERANCE
            )
            if not speed_ok or not accel_ok:
                raise RuntimeError(f"Round-trip check failed: {sample_id}")

            output_rows.append({
                "sample_id": sample_id,
                "speed_kmh": f"{speed_kmh:g}",
                "speed_m_s": f"{speed_ms:.6f}",
                "speed_roundtrip_kmh": f"{speed_roundtrip:.6f}",
                "accel_g": f"{accel_g:g}",
                "accel_m_s2": f"{accel_ms2:.6f}",
                "accel_roundtrip_g": f"{accel_roundtrip:.6f}",
                "roundtrip_check": "PASS",
            })

    OUTPUT_DIR.parent.mkdir(parents=True, exist_ok=True)
    OUTPUT_DIR.mkdir()
    fields = [
        "sample_id", "speed_kmh", "speed_m_s", "speed_roundtrip_kmh",
        "accel_g", "accel_m_s2", "accel_roundtrip_g", "roundtrip_check"
    ]
    with OUTPUT.open("x", encoding="utf-8", newline="") as stream:
        writer = csv.DictWriter(stream, fieldnames=fields)
        writer.writeheader()
        writer.writerows(output_rows)

    print(f"Converted records: {len(output_rows)}.")
    print(f"Round-trip checks passed: {len(output_rows)}.")
    print(f"Standard gravity used: {STANDARD_GRAVITY} m/s^2.")
    print(f"Output: {OUTPUT.as_posix()}")


if __name__ == "__main__":
    main()

05想定される変換後ファイルと比較する

reverse conversion の後、すべての行が元の速度と加速度に戻るはずです。以下は小数点以下6桁の出力です。internal calculations では formatting 前に floating-point values を使用します。

csv
sample_id,speed_kmh,speed_m_s,speed_roundtrip_kmh,accel_g,accel_m_s2,accel_roundtrip_g,roundtrip_check
T001,0,0.000000,0.000000,0,0.000000,0.000000,PASS
T002,36,10.000000,36.000000,1,9.806650,1.000000,PASS
T003,72,20.000000,72.000000,-0.5,-4.903325,-0.500000,PASS
T004,90,25.000000,90.000000,0.25,2.451663,0.250000,PASS
T005,108,30.000000,108.000000,-1.25,-12.258313,-1.250000,PASS

以下の想定 console text は、合成データとスクリプトから手作業で導出したものです。実際に取得した execution log ではありません。

text
Converted records: 5.
Round-trip checks passed: 5.
Standard gravity used: 9.80665 m/s^2.
Output: outputs/unit_conversion_result/converted_test_data.csv

06独立した確認を行い、よくあるエラーを把握する

  • 36 km/h を手作業で確認します: 36 ÷ 3.6 = 10 m/s.
  • 108 km/h を手作業で確認します: 108 ÷ 3.6 = 30 m/s.
  • -0.5 g を手作業で確認します: -0.5 × 9.80665 = -4.903325 m/s².
  • unit conversion 中に符号が変わらないことを確認します。
  • 5行すべてで roundtrip_check が PASS になっていることを確認します。
  • OUTPUT_DIR を変更せずにスクリプトを再実行します。結果を置き換えるのではなく FileExistsError で停止するはずです。
問題確認すること
速度が 3.6 倍程度ずれているm/s と表示された値を誤って km/h として扱っていないか、またはその逆か確認します。
加速度が約 9.8 倍ずれているg と m/s² を取り違えていないか確認します。
負の加速度が正になるanalysis で magnitude が明確に必要な場合を除き、absolute value を適用しないでください。
想定外の丸め差がある計算には full precision を保持し、表示または export 時だけ丸めます。
round trip は合格するが元データの単位ラベルが間違っている数学的に可逆な conversion では、元データの誤った unit label を検出できません。

07実際の試験データに使用する前に制限を理解する

unit conversion が成功しても、arithmetic と declared units が内部的に一貫していることを示すだけです。元の sensor channel が正しく calibration されていたこと、unit label が正しかったこと、recorded value が想定した physical quantity を表していることまでは証明しません。

ここでの g conversion には conventional standard gravity, 9.80665 m/s² を使用します。local gravitational acceleration はこの conventional reference と異なる場合があります。多くの engineering datasets では g を normalized acceleration unit として使用するため、使用する convention を文書化してください。

実際の vehicle test datasets では、wheel speed, vehicle speed, rotational speed, force, pressure, temperature units も混在する可能性があります。data dictionary を作成し、各 channel をその physical dimension に従って変換してください。数値の magnitude だけから unit を推測しないでください。

実行・検証の記録

2026-09-20 · 手作業で確認した例 · 対象: Python 3.12 · 標準ライブラリ: csv, math, pathlib · 未実行

  • 5つの速度を 0, 10, 20, 25, 30 m/s と手作業で変換しました。
  • 1 g あたり 9.80665 m/s² を用いて acceleration values を手作業で計算しました。
  • 表示丸め前に -0.5 g = -4.903325 m/s², 0.25 g = 2.4516625 m/s², -1.25 g = -12.2583125 m/s² を確認しました。
  • 3.6 を掛けて reverse speed conversions を手作業で確認しました。
  • required columns, duplicate sample IDs, round-trip comparisons, output collision protection, 元 CSV の保持についてコードを確認しました。
  • 想定される CSV と console output を手作業で導出しました。
検証範囲の限界
  • この回答の作成者はコードを実行しておらず、converted CSV は作成していません。
  • sensor calibration, metadata correctness, local gravitational acceleration, 実際の acquisition systems における unit labels はテストしていません。
  • この例で扱うのは km/h, m/s, g, m/s² だけです。
  • 公式ドキュメントの URL は既知のドキュメント所在地に基づいて記載していますが、ライブでは確認していません。

サイト全体の執筆・検証方針

参考資料

説明と例は独自に作成しました。関連する動作や概念は、以下の公式資料で確認できます。