Python中CSV数据类型识别/猜测
我的问题是关于处理大型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文件的结构,或者更好的是
- 单独一列的数据类型 以数组的形式呈现
猜测当前以字符串形式表示的数据类型的方法也有类似的方向。不过,我担心性能问题,因为我可能需要处理很多大型电子表格(数据来源于这些表格)。
5 个回答
4
也许csvsql在这里会有用?我不知道它的效率如何,但它绝对能把CSV文件转换成SQL的创建表语句,完成这个任务。
$ csvsql so_many_columns.csv >> sql_create_table_with_char_types.txt
6
经过一些思考,我会这样设计这个算法:
- 为了提高性能:每一列取一个样本(比如说,1%)
- 对样本中的每个单元格进行正则表达式匹配,检查数据类型
- 根据频率分布选择合适的数据类型
这里有两个问题:
- 什么样的样本量才算足够?对于小数据集呢?对于大数据集呢?
- 根据频率分布选择数据类型时,什么样的阈值才算高呢?
18
你可能会对这个Python库感兴趣,它可以帮你自动猜测CSV和XLS文件中的数据类型:
这个库可以处理非常大的文件,还能处理从互联网流式传输的数据等。
还有一个更简单的库,它包含一个命令行工具,叫做dataconverters:http://okfnlabs.org/dataconverters/(还有一个在线服务:https://github.com/okfn/dataproxy!)
负责猜测数据类型的核心算法在这里:https://github.com/okfn/messytables/blob/7e4f12abef257a4d70a8020e0d024df6fbb02976/messytables/types.py#L164