まず試験 CSV の時間軸と単位を確認する
合成の demonstration data で units、missing values、finite numbers、duplicate または reversed timestamps を確認し、その後 check results と chart を保存します。
合成の車速と加速度データを一貫した SI 単位へ変換し、その結果を元の単位へ戻して計算を確認します。スクリプトは元の CSV を保持し、変換後の値を新しい出力フォルダに書き出します。
この翻訳はAIで作成しました。コード、単位、数値は原文と併せて確認してください。各言語のネイティブ話者による校閲は、まだ完了していません。 English
対象読者速度と加速度の単位が混在する車両データや試験データを扱い、解析前に簡単な単位変換チェックを行いたい人向けのガイドです。
この例では、速度を 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/s | km/h ÷ 3.6 |
| m/s to km/h | m/s × 3.6 |
| g to m/s² | g × 9.80665 |
| m/s² to g | m/s² ÷ 9.80665 |
以下の dataset は合成データであり、この記事のために作成したものです。unit_test_data.csv として保存してください。速度変換を手作業で確認しやすくしつつ、加速度例には正、負、小数の g values が含まれるよう値を選んでいます。
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 を表すことを目的としていません。
速度変換は直接計算できます。たとえば、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_id | speed_kmh | 想定 speed_m_s | accel_g | 想定 accel_m_s2 |
|---|---|---|---|---|
| T001 | 0 | 0.000000 | 0 | 0.000000 |
| T002 | 36 | 10.000000 | 1 | 9.806650 |
| T003 | 72 | 20.000000 | -0.5 | -4.903325 |
| T004 | 90 | 25.000000 | 0.25 | 2.451663 |
| T005 | 108 | 30.000000 | -1.25 | -12.258313 |
表示される acceleration values は小数点以下6桁に丸めています。計算自体では、すでに丸めた output text を繰り返し使用せず、完全な 9.80665 factor を使用してください。
次のスクリプトを unit_conversion_check.py として保存してください。元の values を読み取り、両方の forward conversions を実行し、結果を元の units に戻して、小さな numerical tolerance で round trip を確認します。元の CSV は書き換えません。
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()
reverse conversion の後、すべての行が元の速度と加速度に戻るはずです。以下は小数点以下6桁の出力です。internal calculations では formatting 前に floating-point values を使用します。
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 ではありません。
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| 問題 | 確認すること |
|---|---|
| 速度が 3.6 倍程度ずれている | m/s と表示された値を誤って km/h として扱っていないか、またはその逆か確認します。 |
| 加速度が約 9.8 倍ずれている | g と m/s² を取り違えていないか確認します。 |
| 負の加速度が正になる | analysis で magnitude が明確に必要な場合を除き、absolute value を適用しないでください。 |
| 想定外の丸め差がある | 計算には full precision を保持し、表示または export 時だけ丸めます。 |
| round trip は合格するが元データの単位ラベルが間違っている | 数学的に可逆な conversion では、元データの誤った unit label を検出できません。 |
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 · 未実行
説明と例は独自に作成しました。関連する動作や概念は、以下の公式資料で確認できます。