Распознавание типов данных / угадывание данных CSV в python

Моя проблема заключается в контексте обработки данных из больших файлов CSV.

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

Вот пример:

arr1 = ['0.83', '-0.26', '-', '0.23', '11.23']               # ==> recognize as float
arr2 = ['1', '11', '-1345.67', '0', '22']                    # ==> regognize as int
arr3 = ['2/7/1985', 'Jul 03 1985, 00:00:00', '', '4/3/2011'] # ==> recognize as date
arr4 = ['Dog', 'Cat', '0.13', 'Mouse']                       # ==> recognize as str

Итог: я ищу пакет python или алгоритм, который может определять либо

  • схему файла CSV, либо, что еще лучше,
  • тип данных отдельного человека. столбец как массив

Метод определения типа данных, представленных в настоящее время в виде строк , идет в том же направлении. Однако меня беспокоит производительность, поскольку я, возможно, имею дело со многими большими электронными таблицами (откуда берутся данные)

17
задан Community 23 May 2017 в 12:32
поделиться

2 ответа

Возможно, вас заинтересует эта библиотека на python, которая делает именно такие предположения типов для файлов CSV и XLS:

Он легко масштабируется до очень больших файлов, чтобы передавать данные из Интернета и т.д.

Существует также еще более простая библиотека-оболочка, которая включает инструмент командной строки с именем dataconverters: http://okfnlabs.org/dataconverters/ (и онлайн-сервис: https: // github .com / okfn / dataproxy !)

Основной алгоритм, позволяющий определять тип: .py # L164

13
ответ дан 30 November 2019 в 13:11
поделиться

Вы можете попробовать предварительный анализ с помощью регулярных выражений. Например:

import re
pattern = re.compile(r'^-?\d+.{1}\d+ 

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

myregex = {int: r'^-?\d+ 

Не забывайте «^» в в начале и '$' в конце, если не регулярное выражение может соответствовать части строки и вернуть объект.

Надеюсь, это поможет:)

, float: r'^\d+.{1}\d+

Не забывайте «^» в в начале и '$' в конце, если не регулярное выражение может соответствовать части строки и вернуть объект.

Надеюсь, это поможет:)

, ....} for key, reg in myregex.items(): to_del = [] for index, data in enumerate(arr1): if re.match(reg,data): d = key(data) # You will need to insert data differently depending on function ....#---> do something to_del.append(data) # ---> delete this when you can from arr1

Не забывайте «^» в в начале и '$' в конце, если не регулярное выражение может соответствовать части строки и вернуть объект.

Надеюсь, это поможет:)

) data = '123.42' print pattern.match(data) # ----> object data2 = 'NOT123.42GONNA31.4HAPPEN' print pattern.match(data2) # ----> None

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

myregex = {int: r'^-?\d+ 

Не забывайте «^» в в начале и '$' в конце, если не регулярное выражение может соответствовать части строки и вернуть объект.

Надеюсь, это поможет:)

, float: r'^\d+.{1}\d+

Не забывайте «^» в в начале и '$' в конце, если не регулярное выражение может соответствовать части строки и вернуть объект.

Надеюсь, это поможет:)

, ....} for key, reg in myregex.items(): to_del = [] for index, data in enumerate(arr1): if re.match(reg,data): d = key(data) # You will need to insert data differently depending on function ....#---> do something to_del.append(data) # ---> delete this when you can from arr1

Не забывайте «^» в в начале и '$' в конце, если не регулярное выражение может соответствовать части строки и вернуть объект.

Надеюсь, это поможет:)

3
ответ дан 30 November 2019 в 13:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: