Python中CSV数据类型识别/猜测

24 投票
5 回答
15438 浏览
提问于 2025-04-16 22:15

我的问题是关于处理大型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

撰写回答