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

如何将CSV中的日期列直接作为datetime[ns]类型加载到Pandas数据帧中?[副本]

  •  1
  • halloleo  · 技术社区  · 7 年前

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

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

    当run出错时:

    类型错误:不理解数据类型“datetime”

    在事后通过pandas.to_datetime()转换列不是一个选项,我不知道哪些列将是datetime对象。这些信息可以更改,并且来自任何通知我的数据类型列表的信息。

    0 回复  |  直到 7 年前
        1
  •  254
  •   firelynx    7 年前

    为什么不起作用

    由于csv文件只能包含字符串、整数和浮点数,因此没有为读取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)
    

    这将导致熊猫阅读 col1 col2 作为字符串,它们最有可能是(“2016-05-05”等),并且在读取字符串之后,每个列的date_解析器将作用于该字符串并返回该函数返回的任何内容。

    这个 功能 有一个名为

    将此设置为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

        2
  •  25
  •   Asclepius    5 年前

    有一个 parse_dates 参数 read_csv

    date_cols = ['col1', 'col2']
    pd.read_csv(file, sep='\t', header=None, names=headers, parse_dates=date_cols)
    
        3
  •  13
  •   Paul H    12 年前

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

    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)
    
        4
  •  6
  •   Jose Buraschi    11 年前

    我尝试使用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)