Разбор и очистка дат рождения

Персональные данные являются одними из самых «загрязненных». Как показал опрос, проведенный научным сообществом Kaggle, около 16,7 тыс. опрошенных из 1,3 млн. членов сообщества чаще всего называли «грязные данные» одним из самых больших барьеров в работе. Проблемы с качеством встречаются в отдельных наборах данных (файлы, базы данных) как результат ошибок при вводе, потери при конвертации из разных форматов и по другим причинам. Неочищенные данные не могут быть объектом анализа, поэтому для их практического использования требуется проведение предварительной очистки.

В текущем примере демонстрируется, как очистить даты рождения и привести их к единому формату с помощью Loginom.

Запустить демо

Установить локально

Описание алгоритма

1. Импорт данных

Импорт набора данных

Набор данных насчитывает более 1000 записей с датами рождений.

Имя поля Метка поля
birthDate Дата рождения

2. Очистка данных

Процесс очистки состоит из двух этапов:

  • разбор даты на составляющие: день, месяц и год (подмодель Очистка и разбор дат на день, месяц и год)
  • приведение очищенной записи к виду dd.mm.yyyy (подмодель Приведение к стандартному формату)

В неочищенных датах месяц может быть записан буквами или числом. В зависимости от этого применяются разные подходы к очистке.

Разбор даты рождения — месяц задан строкой

В узле калькулятор c использованием регулярных выражений выделен день, месяц, год.

Примечание: регулярные выражения считаются ресурсоёмкими операциями. Для увеличения производительности проверка всех форматов записи дат (dd.mm.yyyy, dd.mm.yy, mm.dd.yyyy и тд.) будет выполняться с помощью оператора if, т.к. он работает по принципу ленивых вычислений.

Извлечение первых трех символов строкового месяца формата d/month/yy и dd/month/yyyy, результатом которого будет запись значений в промежуточное поле День рождения 1:

RegExMatchedSubExp("\b(0?[1-9]|[12][0-9]|3[01])[- /.,](([A-Z]|[А-ЯЁ]){3,})[- /.,](19|20)?[0-9]{2}\b", Trim(Upper(birthdate)), 1)

Функция RegExMatchedSubExp — возвращает группу части строки, соответствующую регулярному выражению.

Извлечение первых трех символов строкового месяца формата yy-month-d и yyyy-month-dd, результатом которого будет запись значений в поле День рождения 2:

if(day1 <> "", day1, RegExMatchedSubExp("\b(19|20)?[0-9]{2}[- /.,]([A-ZА-ЯЁ]{3,})[- /.,](0?[1-9]|[12][0-9]|3[01])\b", Trim(Upper(birthdate)), 3))

Если день после прохождения первого регулярного выражения не был выделен из записи, тогда следует проверка следующих форматов: yy-month-d, yyyy-month-dd. Однако если день в предыдущем регулярном выражении уже был определен, то проверка дальнейших форматов не будет производиться. Именно так работает принцип ленивых вычислений.

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

Аналогично в отдельные поля извлекаются месяц и год.

Разветвление алгоритма

В узле Фильтр строк в отдельный набор выделяются записи, которые были разобраны на предыдущем шаге.

Замена текстового месяца

В узле Кодировка месяца загружается набор данных.

В узле Присоединение кодировки месяца буквенной записи месяца сопоставлены его номер и полное название.

Разбор даты рождения — месяц задан числом

Те записи, которые не были разобраны (нижний порт узла Фильтр строк) переходят на обработку узла Разбор даты рождения — месяц задан числом. В узле происходит разбор всех форматов дат. С помощью регулярных выражений в отдельные поля заносятся день, месяц, год.

Примеры форматов, из которых извлекаются атрибуты день, месяц, год:

  • d/m/yy и dd/mm/yyyy
  • m/d/y и mm/dd/yyyy
  • yy/m/d и yyyy/mm/dd
  • dmyy и ddmmyyyy
  • mdy и mmddyyyy
Объединение результатов разбора

На выходе узлов Разбор даты рождения — месяц задан числом и Присоединение кодировки месяца содержатся разобранные данные, которые необходимо объединить. Из указанных наборов в объединении участвуют только те поля, которые задают следующую структуру результирующего набора:

Имя поля Метка поля
birthDate Дата рождения
birthDay День рождения
birthMonth Месяц рождения
birthYear Год рождения

Полученные записи с помощью узла Разделение на разобранные и некорректные разделены на 2 набора: полностью разобранные даты и строки с пустыми полями.

На выходе из подмодели Очистка и разбор дат на день, месяц и год образовалось 2 порта:

  • Успешно разобранные даты
  • Некорректные данные

На следующем шаге даты приводятся к единому формату dd.mm.yyyy с типами данных: Строковый и Дата/Время.

Приведение к стандартному формату

В узле Формат дня и года день приводится к формату dd, год — к yyyy, а также помечаются записи с некорректно заданным годом, например, если год рождения больше текущего года, или если невозможно однозначно определить год (12 год 1912 или 2012?).

Некорректные даты фильтруются с помощью узла Фильтр строк.

На данном шаге имеются однозначно разобранные поля, которые в узле Дата в формате 'dd.mm.yyyy' с помощью функции concat соединяются в одну строку.

C помощью функции StrToDate сформировано поле типа Дата/Время с записью даты в формате dd.mm.yyyy.

В итоговой таблице 3 поля:

Имя поля Метка поля
birthDate Дата рождения
strResultDate Итоговая дата в формате строка
resultDate Итоговая дата в формате Дата

На последнем шаге в узле Объединение объединяются все данные в одну таблицу. Даты, которые не удалось очистить, также будут отображаться в итоговом наборе.


Очистка данных перед загрузкой в хранилище

Регулярные выражения в Loginom

Скачайте и откройте файл в Loginom. При необходимости Loginom CE можно скачать бесплатно

Скачать демопример

Минимальные требования к системе:

  • Операционная система: Windows 8.1 и выше.
  • CPU x64: 1 core.
  • Оперативная память: 1 GB.
  • Жесткий диск: 10 GB.