Вы открываете таблицу с расстояниями, и в каждой строке единица измерения своя. Где-то стоит «125» рядом с «mm», где-то — «0,13» и «m», а в одной ячейке просто число «12» без пометок. Чтобы сравнивать и анализировать такие данные, все значения нужно привести к одной единице, скажем, к сантиметрам. Разберём эту задачу на учебном примере — шаг за шагом — и посмотрим, какие ловушки встречаются в таком, казалось бы, простом деле.

Все строки, ID и значения далее вымышлены. По условию учебного протокола distance — расстояние метки от начала шкалы; ноль допустим. Целевая единица — сантиметр. Это пример подготовки таблицы, а не результаты реальных измерений.

Что нужно получить в итоге

На выходе — протокол с полями:

  • raw_value — число из исходной записи;
  • raw_unit — единица, как она записана в источнике (латинские cm, mm, m или пусто);
  • target_unit — целевая единица, в нашем случае cm;
  • distance_cm — расстояние, уже пересчитанное в сантиметры.

В этом примере исходные raw_value и raw_unit сохраняем неизменными в отдельном сыром файле. В рабочей версии добавляем distance_cm, target_unit и статус преобразования: так можно сопоставить результат с исходной строкой.

Исходные данные

В учебном примере пять условных строк с идентификаторами от L01 до L05:

ID   raw_value; raw_unit
L01   12; cm
L02   125; mm
L03   0,13; m
L04   12; единица не указана
L05   0; mm
Учебная схема перевода миллиметров и метров в сантиметры: 125 мм равны 12,5 см, 0,13 м равны 13 см; неизвестная единица остаётся неуточнённой.
Учебная схема, данные вымышлены. Ноль — известное допустимое расстояние по условию примера. Контрольная сумма четырёх известных значений — 37,5 см.

В примере cm обозначает сантиметры, mm — миллиметры, m — метры. Таблица префиксов SI Национального института стандартов и технологий США (NIST) определяет centi как одну сотую, а milli — как одну тысячную единицы. Поэтому 1 см = 10 мм, а 1 м = 100 см.

Правила пересчёта

  • Сантиметры (cm): сохраняем число без изменения.
  • Миллиметры (mm): делим на 10, так как 1 cm = 10 mm.
  • Метры (m): умножаем на 100, так как 1 m = 100 cm.
  • Единица не указана: пересчёт невозможен. Число 12 не позволяет угадать, в чём его измеряли. Оставляем как неопределённое значение.

Здесь действует строгое правило: единицу измерения можно уточнить только по первичной документации, а не по похожести числа. Если документа нет — нет и пересчёта.

Пошаговый разбор каждой строки

L01: 12 cm

Единица уже сантиметр. Ничего не делаем: 12 cm. В итоговой записи: 12 см.

L02: 125 mm

Переводим миллиметры в сантиметры. По данным NIST, milli = 10⁻³, centi = 10⁻², значит 1 cm = 10 mm. Делим 125 на 10 и получаем 12,5. Запись: 12,5 см. Обратная проверка: умножаем 12,5 см на 10 — получаем 125 мм. Всё верно.

L03: 0,13 m

Переводим метры в сантиметры. 1 m = 100 cm, умножаем 0,13 на 100 и получаем 13. Запись: 13 см. Обратная проверка: 13 делим на 100 — получаем 0,13. Всё сходится.

L04: 12 (единица не указана)

Число 12 может быть миллиметрами, сантиметрами или метрами. Выбрать что-то одно без документации нельзя. Запись: не определено, статус — unit_unknown. Обратите внимание: мы не заменяем неопределённость нулём. Нуль — это известное значение, а здесь единица не указана; причина этого неизвестна.

L05: 0 mm

Нуль миллиметров. По правилу делим на 10: 0 / 10 = 0. Запись: 0 см. Это известное нулевое значение, а не пропуск. Его нужно сохранять как нормализованное число.

Сводная таблица результата

ID   distance_cm и статус
L01   12 см; ok
L02   12,5 см; ok
L03   13 см; ok
L04   Не определено; unit_unknown
L05   0 см; ok

Статус ok здесь означает, что единица распознана и значение приведено к сантиметрам. Он не подтверждает качество реального измерения. Для каждой из пяти строк target_unit равен cm, но у L04 числовой результат остаётся не определён.

Четыре известных нормализованных значения: 12 + 12,5 + 13 + 0 = 37,5 см. Это контрольная сумма пересчитанных значений, а не итог всех пяти наблюдений и не оценка среднего.

Журнал коэффициентов

Чтобы любой мог проверить пересчёт, полезно вести журнал коэффициентов — запись того, какие коэффициенты к каким строкам применялись.

ID   Коэффициент и направление
L01   × 1: cm → cm
L02   × 0,1: mm → cm
L03   × 100: m → cm
L04   Не применён: единица не установлена
L05   × 0,1: mm → cm

Этот журнал — часть того же подхода, что описан в статье про журнал очистки данных: каждое решение привязано к конкретной записи.

Чего не делаем

  • Не придумываем единицу для L04 на основе похожести чисел.
  • Не заменяем неопределённое значение нулём.
  • Не добавляем оценку точности, погрешности или округления — в исходных данных их нет.
  • Не вычисляем среднее значение. У нас контрольная сумма, а не среднее.

Проверка: полный контроль

Исходных записей — 5, в рабочей версии также 5. Четыре строки нормализованы: L02, L03 и L05 пересчитаны в сантиметры, а L01 уже содержит сантиметры. Обратное преобразование проверяем для четырёх строк с известной единицей. L04 проверяем отдельно: исходное число 12 сохранено, distance_cm не определён, статус unit_unknown; коэффициент не применён.

Если ваш учебный или исследовательский проект сталкивается с похожей задачей — несколько единиц длины в одной таблице, — вы можете согласовать задачу на статистический анализ, чтобы обсудить объём работы и подход к нормализации данных.

Коротко о единицах

Для этого учебного файла заданы три распознаваемые метки: cm, mm и m. Если встретится иное написание, сначала установите по исходной документации, какую единицу имел в виду автор. Не меняйте регистр обозначений автоматически и не подбирайте коэффициент по похожести чисел.

Источники