Моя проблема заключается в контексте обработки данных из больших файлов 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 или алгоритм, который может определять либо
Метод определения типа данных, представленных в настоящее время в виде строк , идет в том же направлении. Однако меня беспокоит производительность, поскольку я, возможно, имею дело со многими большими электронными таблицами (откуда берутся данные)
Возможно, вас заинтересует эта библиотека на python, которая делает именно такие предположения типов для файлов CSV и XLS:
Он легко масштабируется до очень больших файлов, чтобы передавать данные из Интернета и т.д.
Существует также еще более простая библиотека-оболочка, которая включает инструмент командной строки с именем dataconverters: http://okfnlabs.org/dataconverters/ (и онлайн-сервис: https: // github .com / okfn / dataproxy !)
Вы можете попробовать предварительный анализ с помощью регулярных выражений. Например:
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
Не забывайте «^» в в начале и '$' в конце, если не регулярное выражение может соответствовать части строки и вернуть объект.
Надеюсь, это поможет:)