问题:熊猫中的datetime dtypes read_csv
我正在读取具有多个datetime列的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,但它会使数据乱码。任何帮助是极大的赞赏!
回答 0
为什么它不起作用
没有为read_csv设置datetime dtype,因为csv文件只能包含字符串,整数和浮点数。
将dtype设置为datetime将使熊猫将datetime解释为对象,这意味着您将以字符串结尾。
熊猫解决这个问题的方法
使用此功能,您可以使用默认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_parser都会对该字符串起作用,并返回该函数返回的任何内容。
定义自己的日期解析功能:
将其设置为lambda函数将使该特定函数可用于日期解析。
GOTCHA警告
您必须为其提供功能,而不是功能的执行,因此这是正确的
date_parser = pd.datetools.to_datetime
这是不正确的:
date_parser = pd.datetools.to_datetime()
熊猫0.22更新
pd.datetools.to_datetime
已移至 date_parser = pd.to_datetime
谢谢@stackoverYC
回答 1
有一个parse_dates
参数read_csv
可让您定义要视为日期或日期时间的列的名称:
date_cols = ['col1', 'col2']
pd.read_csv(file, sep='\t', header=None, names=headers, parse_dates=date_cols)
回答 2
您可以尝试传递实际类型而不是字符串。
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)
但是,如果没有任何可修改的数据,将很难诊断出来。
实际上,您可能希望熊猫将日期解析为时间戳记,因此可能是:
pd.read_csv(file, sep='\t', header=None, names=headers, parse_dates=True)
回答 3
我尝试使用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)