pandas read_csv中的datetime dtypes

时间:2014-01-21 21:24:17

标签: python csv datetime pandas dataframe

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

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

运行时出错:

  

TypeError:数据类型“datetime”未理解

事后转换列,通过pandas.to_datetime()不是一个选项,我不知道哪些列是datetime对象。这些信息可以改变,也可以来自我的dtypes列表。

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

6 个答案:

答案 0 :(得分:204)

为什么它不起作用

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

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

Pandas解决这个问题的方法

pandas.read_csv()函数有一个名为parse_dates

的关键字参数

使用此功能,您可以使用默认date_parserdateutil.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 column将对该字符串执行操作并返回该函数返回的内容。

定义自己的日期解析功能:

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

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

GOTCHA WARNING

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

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

答案 1 :(得分:13)

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

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将日期解析为TimeStamps,因此可能是:

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

答案 2 :(得分:8)

现在可以传递给read_csv的parse_dates参数,它允许您列出要作为日期处理的列的名称。因此OP的最佳方式是:

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

current read_csv documentation 漂亮的时髦......

答案 3 :(得分:6)

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

我使用了以下代码并且它有效:

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