熊猫在csv

时间:2017-04-05 16:43:00

标签: python csv pandas

我正在尝试用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]

仍然会出现同样的错误:(

1 个答案:

答案 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