我正在读取一个具有多个日期时间列的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对象。该信息可以更改,并且来自通知dtypes列表的任何信息。

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


当前回答

read_csv有一个parse_dates参数,它允许你定义你想要作为日期或日期时间处理的列的名称:

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

其他回答

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

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)

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

为什么它不起作用

没有datetime dtype为read_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)

这将导致pandas将col1和col2读取为字符串,它们很可能是字符串("2016-05-05"等),读取字符串后,每个列的date_parser将对该字符串进行处理,并返回该函数返回的任何内容。

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

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

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

警告

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

date_parser = pd.datetools.to_datetime

这是不正确的:

date_parser = pd.datetools.to_datetime()

Pandas 0.22更新

pd.datetools。To_datetime已重新定位到date_parser = pd.to_datetime

由于@stackoverYC

read_csv有一个parse_dates参数,它允许你定义你想要作为日期或日期时间处理的列的名称:

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

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

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