pandas read_csv中的datetime dtypes

use*_*055 101 python csv datetime dataframe pandas

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

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

运行时出错:

TypeError:数据类型"datetime"未被理解

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

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

fir*_*ynx 235

为什么它不起作用

没有为read_csv设置datetime dtype,因为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)
Run Code Online (Sandbox Code Playgroud)

这将导致pandas读取col1col2作为字符串,它们很可能是("2016-05-05"等)并且在读取字符串之后,每列的date_parser将对该字符串起作用并返回该函数返回的任何内容.

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

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

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

GOTCHA警告

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

date_parser = pd.datetools.to_datetime
Run Code Online (Sandbox Code Playgroud)

这是不正确的:

date_parser = pd.datetools.to_datetime()
Run Code Online (Sandbox Code Playgroud)

熊猫0.22更新

pd.datetools.to_datetime 已经搬迁到 date_parser = pd.to_datetime

谢谢@stackoverYC

  • 这是一个缓慢的解决方案。改为查看此内容:/sf/ask/2091780141/ (2认同)
  • 在pandas 0.22.0 上说`pandas.core.datetools.to_datetime` 已被弃用,请改用`pd.datetools.to_datetime`。像这样:`date_parser = pd.to_datetime` (2认同)
  • 还有一个“converters”参数,您可以在其中指定哪些列具有哪些转换器。parse_dates 很有帮助,可以处理坏数据,但由于它测试和推断每个值而速度较慢 https://gist.github.com/gjreda/7433f5f70299610d9b6b (2认同)

mrj*_*hms 18

现在有一个parse_dates参数可以传递给read_csv,它允许您列出要作为日期处理的列的名称.那么现在OP的最佳方式是:

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

目前的read_csv文档 非常时髦......

  • 我在传递列的单个字符串名称时遇到错误,现在我明白我还需要传递单个值的列表。 (2认同)

Pau*_*l H 14

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

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)
Run Code Online (Sandbox Code Playgroud)

但是如果没有你的任何数据修补它将很难诊断出来.

实际上,您可能希望pandas将日期解析为TimeStamps,因此可能是:

pd.read_csv(file, sep='\t', header=None, names=headers, parse_dates=True)
Run Code Online (Sandbox Code Playgroud)


小智 7

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

df[target_col] = pd.to_datetime(df[target_col])
Run Code Online (Sandbox Code Playgroud)


小智 7

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

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

  • 添加上下文说明为什么这对您有效将帮助其他用户更好地理解您的答案。 (2认同)

小智 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)
Run Code Online (Sandbox Code Playgroud)

我遇到以下错误:

TypeError: data type not understood
Run Code Online (Sandbox Code Playgroud)

我必须做的唯一改变是用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)
Run Code Online (Sandbox Code Playgroud)

  • 除了这不具有预期效果的事实之外,它也不起作用:`AttributeError:type object'datetime.datetime'没有属性'datetime' (8认同)
  • 这仍然会使结果数据帧的dtype成为对象,而不是pandas.datetime (3认同)