代码之家  ›  专栏  ›  技术社区  ›  fmark

用于猜测当前表示为字符串的数据类型的方法

  •  2
  • fmark  · 技术社区  · 14 年前

    发现“数据类型” 列的名称。我不知道值的确切格式。显然,CSV解析器输出的所有内容都是一个字符串。我目前感兴趣的数据类型有:

    1. 浮点
    2. 日期
    3. 布尔值
    4. 一串

    我特别关注日期数据类型- ?

    5 回复  |  直到 8 年前
        1
  •  3
  •   Vinko Vrsalovic    14 年前

    Dateutil 会想到解析日期。

    对于整数和浮点数,您可以在try/except部分尝试强制转换

    >>> f = "2.5"
    >>> i = "9"
    >>> ci = int(i)
    >>> ci
    9
    >>> cf = float(f)
    >>> cf
    2.5
    >>> g = "dsa"
    >>> cg = float(g)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: invalid literal for float(): dsa
    >>> try:
    ...   cg = float(g)
    ... except:
    ...   print "g is not a float"
    ...
    g is not a float
    >>>
    
        2
  •  4
  •   Ignacio Vazquez-Abrams    14 年前

    ast.literal_eval()

        3
  •  2
  •   S.Lott    14 年前

    这些不存在于CSV文件中。数据只是字符串。只是。没别的了。

    除了你在样本中看到的,什么都没告诉你。示例后面的下一行可以是一个看起来与示例字符串完全不同的字符串。

    如果第1列应该是日期,则必须查看字符串并计算出格式。可能是任何东西。一个数字,一个典型的美国或欧洲格式的公历日期(没有办法知道1/1/10是美国还是欧洲)。

    try:
        x= datetime.datetime.strptime( row[0], some format )
    except ValueError:
        # column is not valid.
    

    如果列2应该是一个float,那么只能这样做。

    try:
        y= float( row[1] )
    except ValueError:
        # column is not valid.
    

    如果第3列应该是int,则只能这样做。

    try:
        z= int( row[2] )
    except ValueError:
        # column is not valid.
    

    float 在每一行。如果一行失败,则说明有人准备文件不正确。

    由于您必须进行转换以查看转换是否可行,因此您不妨简单地处理该行。它更简单,一次就能得到结果。

    想象上的 去那里。

        4
  •  2
  •   Rufus Pollock    10 年前

    您可能会对这个python库感兴趣,它对一般python数据以及CSVs和XLS文件都执行这种类型猜测:

    还有一个更简单的包装器库,其中包含一个名为dataconverters的命令行工具: http://okfnlabs.org/dataconverters/ (和在线服务: https://github.com/okfn/dataproxy !)

    进行类型猜测的核心算法如下: https://github.com/okfn/messytables/blob/7e4f12abef257a4d70a8020e0d024df6fbb02976/messytables/types.py#L164

        5
  •  2
  •   Capripot    4 年前

    我们测试了 ast.literal_eval() 但是从错误中解救是相当缓慢的,如果你想从你接收的所有数据中强制转换 string

    下面这种方法对我们很有效。

    import datetime
    import re
    
    """
    Helper function to detect the appropriate type for a given string.
    """
    def guess_type(s):
        if s == ""
            return None
        elif re.match("\A[0-9]+\.[0-9]+\Z", s):
            return float
        elif re.match("\A[0-9]+\Z", s):
            return int
        # 2019-01-01 or 01/01/2019 or 01/01/19
        elif re.match("\A[0-9]{4}-[0-9]{2}-[0-9]{2}\Z", s) or \
             re.match("\A[0-9]{2}/[0-9]{2}/([0-9]{2}|[0-9]{4})\Z", s): 
            return datetime.date
        elif re.match("\A(true|false)\Z", s):
            return bool
        else:
            return str
    

    assert guess_type("") == None
    assert guess_type("this is a string") == str
    assert guess_type("0.1") == float
    assert guess_type("true") == bool
    assert guess_type("1") == int
    assert guess_type("2019-01-01") == datetime.date
    assert guess_type("01/01/2019") == datetime.date
    assert guess_type("01/01/19") == datetime.date