我正在尝试用pandas读取csv文件。文件非常长,中间错误,如此
Date,Received Date,Tkr,Theta,Wid,Per
2007-08-03,2017/02/13 05:30:G,F,B,A,1
2007-08-06,2017/02/13 05:30:G,F,A,B,1
2007-08-07,2017/02/13 05:30:G,F,A,B,1
2007-08-,nan,,,,
2000-05-30 00:00:00,2017/02/14 05:30:F,D,10,1,1
2000-05-31 00:00:00,2017/02/14 05:30:F,D,10,1,1
我失败的路线是:
full_frame = pd.read_csv(path, parse_dates=["Date"],error_bad_lines=False).set_index("Date").sort_index()[:date]
错误
TypeError: unorderable types: str() > datetime.datetime()
File "/A/B/C.py", line 236, in load_ex
full_frame = pd.read_csv(path, parse_dates=["Date"],error_bad_lines=False).set_index("Date").sort_index()[:date]
date
只是一个包含给定输入日期的变量。
这是因为中间的虚线。我试过了
error_bad_line=False
但是这不会阻止我的脚本失败。
当我从我的csv中取出坏线并运行它时,它运行正常。这个csv将被用作输入,我无法在源头修改它,所以我想知道是否有一种方法可以跳过基于pandas中csv中行的长度的行或我可以做的其他事情复制/修改文件
更新
如果我只是做
,那么坏行将存储在我的数据框中read_csv
为2007-08- NaN NaN NaN NaN NaN
更新2:
如果我尝试做的话
full_frame = pd.read_csv(path, parse_dates=["Date"],error_bad_lines=False)
full_frame = full_frame.dropna(how="any")
# this drops the NaN row for sure
full_frame = full_frame.set_index("Date").sort_index()[:date]
仍然会出现同样的错误:(
答案 0 :(得分:2)
所以我给了他一个快速的镜头。您的数据存在不一致之处,您的分析可能会引起您的不一致,您应该进行调查。分析与数据质量一样好。
这里有一些代码(不是最好的,但主要完成工作)
首先,由于您的数据需要一些工作,我将其作为原始文本阅读。然后我写一个函数来解析日期。我在一个列表中收集列,在另一个列表中收集其余数据。
对于需要有日期的所有数据,我一次循环数据1行并将其传递给parse_dates。
parse_dates
通过读取列表,抓取列表中的第一项(日期部分)然后尝试将其从简单字符串转换为日期来工作。由于并非所有都是日期时间,因此我只获取前几个字节的前10个字节。
获得更清晰的数据后,我将其传递给pandas
并获取数据帧。然后我将日期设置为索引。这可以改进,但鉴于这不是我的工作,我会让你做其余的事。
import pandas as pd
import datetime as dt
rawdata = []
with open("test.dat", "r") as stuff:
for line in stuff:
line1 = line[:-1]
rawdata.append(line1.split(","))
def parse_dates(line):
datepart = line[0][:10] ## get the date-time, and for the date-time, only get the date part
## since not all rows have date + time, cut it down to date
try:
result = dt.datetime.strptime(datepart, "%Y-%m-%d") ## try converting to date
except ValueError:
result = None
line[0] = result ## update
return line
cols = rawdata[0]
data = rawdata[1:]
print data
data = [parse_dates(line) for line in data]
print data
df = pd.DataFrame(data = data, columns = cols)
print df
df.index = df['Date']
此外,简单的Google搜索显示了许多使用Python + pandas处理日期的方法。这是我找到的一个链接: https://chrisalbon.com/python/strings_to_datetime.html