Python pandas read\u csv中的日期时间数据类型

Python pandas read\u csv中的日期时间数据类型,python,csv,datetime,pandas,dataframe,Python,Csv,Datetime,Pandas,Dataframe,我正在读取一个包含多个datetime列的csv文件。我需要在读取文件时设置数据类型,但datetimes似乎是个问题。例如: headers = ['col1', 'col2', 'col3', 'col4'] dtypes = ['datetime', 'datetime', 'str', 'float'] pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes) 运行时出现错误: TypeError:无法理

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

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对象。这些信息可以更改,并且来自于通知我的数据类型列表的任何信息


或者,我尝试使用numpy.genfromtxt加载csv文件,在该函数中设置数据类型,然后将其转换为pandas.dataframe,但它会弄乱数据。非常感谢您的帮助

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

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)
为什么它不起作用 由于csv文件只能包含字符串、整数和浮点数,因此无法为read_csv设置日期时间数据类型

将数据类型设置为datetime将使pandas将datetime解释为对象,这意味着您将得到一个字符串

如何解决这个问题 该函数有一个名为
parse\u dates

使用此功能,您可以使用默认的
date\u解析器
dateutil.parser.parser
)动态地将字符串、浮点或整数转换为datetime

这将导致panda将
col1
col2
作为字符串读取,它们很可能是(“2016-05-05”等),读取字符串后,每列的日期解析器将对该字符串进行处理,并返回函数返回的任何内容

定义自己的日期解析函数: 函数还有一个名为
date\u 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)
将此设置为lambda函数将使该特定函数用于解析日期

明白了,警告 您必须给它函数,而不是函数的执行,因此这是正确的

date_parser = pd.datetools.to_datetime
这是不正确的

date_parser = pd.datetools.to_datetime()
熊猫0.22更新
pd.datetools.to\u datetime
已重新定位到
date\u parser=pd.to\u datetime


感谢@stackoverYC

有一个
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])

我使用了以下代码,并且它工作正常:

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

这仍然会使生成的数据帧的数据类型成为一个对象,而不是一个pandas.datetime。除了没有预期效果之外,它也不起作用:
AttributeError:type object'datetime.datetime'没有属性'datetime'
@Drake我认为user3221055从未真正回到过该站点。这就是问题所在。个人资料上说“最后一次出现在2014年5月20日2:35”,这是一个缓慢的解决方案。改为看这个:@user1761806嘿,好发现!不过我做了一个更好的。在pandas 0.22.0上说
pandas.core.datetools.to_datetime
不推荐使用,请改用
pd.datetools.to_datetime
。类似这样:
date\u parser=pd.to\u datetime
还有一个
converters
参数,您可以在其中指定哪些列具有哪些转换器。parse_dates很有帮助,可以处理坏数据,但速度较慢,因为它测试和推断每个值时出错,因为我传递的是列的单个字符串名称,现在我知道我也需要传递单个值的列表。添加上下文说明为什么这对您有效,可以帮助其他用户更好地理解您的答案。