Вы открываете таблицу с расстояниями, и в каждой строке единица измерения своя. Где-то стоит «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 |

В примере 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. Если встретится иное написание, сначала установите по исходной документации, какую единицу имел в виду автор. Не меняйте регистр обозначений автоматически и не подбирайте коэффициент по похожести чисел.