【问题标题】:datetime dtypes in pandas read_csv大熊猫read_csv中的日期时间dtypes
【发布时间】:2014-02-11 17:05:43
【问题描述】:

我正在读取一个包含多个日期时间列的 csv 文件。我需要在读取文件时设置数据类型,但日期时间似乎是个问题。例如:

headers = ['col1', 'col2', 'col3', 'col4']
dtypes = ['datetime', 'datetime', 'str', 'float']
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)

运行时报错:

TypeError:数据类型“日期时间”不理解

事后通过 pandas.to_datetime() 转换列不是一个选项我不知道哪些列将是日期时间对象。该信息可能会发生变化,并且来自我的 dtypes 列表中的任何信息。

或者,我尝试使用 numpy.genfromtxt 加载 csv 文件,在该函数中设置 dtypes,然后转换为 pandas.dataframe,但它会混淆数据。非常感谢任何帮助!

【问题讨论】:

    标签: python csv datetime pandas dataframe


    【解决方案1】:

    您可以尝试传递实际类型而不是字符串。

    import pandas as pd
    from datetime import datetime
    headers = ['col1', 'col2', 'col3', 'col4'] 
    dtypes = [datetime, datetime, str, float] 
    pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)
    

    但是如果没有任何数据可以修补,这将很难诊断。

    实际上,您可能希望 pandas 将日期解析为时间戳,因此可能是:

    pd.read_csv(file, sep='\t', header=None, names=headers, parse_dates=True)
    

    【讨论】:

      【解决方案2】:

      我尝试使用 dtypes=[datetime, ...] 选项,但是

      import pandas as pd
      from datetime import datetime
      headers = ['col1', 'col2', 'col3', 'col4'] 
      dtypes = [datetime, datetime, str, float] 
      pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)
      

      我遇到了以下错误:

      TypeError: data type not understood
      

      我必须做的唯一更改是将 datetime 替换为 datetime.datetime

      import pandas as pd
      from datetime import datetime
      headers = ['col1', 'col2', 'col3', 'col4'] 
      dtypes = [datetime.datetime, datetime.datetime, str, float] 
      pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)
      

      【讨论】:

      • 这仍然会使结果数据框的 dtype 成为对象,而不是 pandas.datetime
      • 除了没有达到预期的效果之外,它也不起作用:AttributeError: type object 'datetime.datetime' has no attribute 'datetime'
      【解决方案3】:

      为什么它不起作用

      没有为 read_csv 设置 datetime dtype,因为 csv 文件只能包含字符串、整数和浮点数。

      将 dtype 设置为 datetime 将使 pandas 将 datetime 解释为一个对象,这意味着您最终会得到一个字符串。

      解决这个问题的熊猫方法

      pandas.read_csv() 函数有一个名为 parse_dates 的关键字参数

      使用它,您可以使用默认的date_parser (dateutil.parser.parser) 即时将字符串、浮点数或整数转换为日期时间

      headers = ['col1', 'col2', 'col3', 'col4']
      dtypes = {'col1': 'str', 'col2': 'str', 'col3': 'str', 'col4': 'float'}
      parse_dates = ['col1', 'col2']
      pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes, parse_dates=parse_dates)
      

      这将导致 pandas 将 col1col2 读取为字符串,它们最有可能是(“2016-05-05”等),并且在读取字符串后,每列的 date_parser 将起作用该字符串并返回该函数返回的任何内容。

      定义自己的日期解析函数:

      pandas.read_csv() 函数有一个名为date_parser的关键字参数

      将此设置为 lambda 函数将使该特定函数用于解析日期。

      问题警告

      你必须给它功能,而不是功能的执行,因此这是正确

      date_parser = pd.datetools.to_datetime
      

      这是不正确

      date_parser = pd.datetools.to_datetime()
      

      熊猫 0.22 更新

      pd.datetools.to_datetime 已迁移至date_parser = pd.to_datetime

      感谢@stackoverYC

      【讨论】:

      • @Drake 我认为 user3221055 从未真正回到该网站。那就是问题所在。个人资料显示“上次查看时间为 2014 年 5 月 20 日 2:35”
      • 这是一个缓慢的解决方案。请改为查看:stackoverflow.com/questions/29882573/…
      • @user1761806 嘿,好发现!不过我做了一个更好的。 stackoverflow.com/a/46183514/3730397
      • 在 pandas 0.22.0 上说 pandas.core.datetools.to_datetime 已弃用,请改用 pd.datetools.to_datetime。像这样:date_parser = pd.to_datetime
      • 还有一个converters 参数,您可以在其中指定哪些列具有哪些转换器。 parse_dates 很有帮助,可以处理不良数据,但由于它测试和推断每个值而速度较慢gist.github.com/gjreda/7433f5f70299610d9b6b
      【解决方案4】:

      read_csv 有一个 parse_dates 参数,可让您定义要视为日期或日期时间的列的名称:

      date_cols = ['col1', 'col2']
      pd.read_csv(file, sep='\t', header=None, names=headers, parse_dates=date_cols)
      

      【讨论】:

      • 我在传递列的单个字符串名称时出错,现在我知道我还需要传递单个值的列表。
      【解决方案5】:

      我的解决方法是加载为其默认类型,然后使用 pandas.to_datetime() 函数向下一行。

      df[target_col] = pd.to_datetime(df[target_col])
      

      【讨论】:

        【解决方案6】:

        我使用了下面的代码,它成功了:

        headers = ['col1', 'col2', 'col3', 'col4']
        df=pd.read_csv(file, sep='\t', header=None, names=headers, parse_dates=['col1', 'col2'])
        

        【讨论】:

        • 添加上下文说明为什么这对您有效,这将帮助其他用户以更好的方式理解您的答案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-06
        • 2016-07-05
        • 2019-07-19
        相关资源
        最近更新 更多