2015-06-16 187 views
0

我想读取包含日期的csv文件。该CSV看起来是这样的:熊猫从csv解析日期

h1,h2,h3,h4,h5 
A,B,C,D,E,20150420 
A,B,C,D,E,20150420 
A,B,C,D,E,20150420 

用于读取CSV我使用此代码:

df = pd.read_csv(filen, 
    index_col=None, 
    header=0, 
    parse_dates=[5], 
    date_parser=lambda t:parse(t)) 

分析函数如下:

def parse(t): 
    string_ = str(t) 
    try: 
     return datetime.date(int(string_[:4]), int(string_[4:6]), int(string_[6:])) 
    except: 
     return datetime.date(1900,1,1) 

我奇怪现在的问题是,在解析函数t看起来像这样:

ndarray: ['20150420' '20150420' '20150420'] 

正如你所看到的,t是数据列的整个数组。我认为解析第一行时应该只有第一个值,解析第二行时只需要第一个值,等等。现在,parse总是以except-block结尾,因为int(string_[:4])包含一个括号,显然,不能转换为int。解析函数的构建目的是一次只解析一个日期(例如,20150420)。

我在做什么错?

编辑:

没关系,我只是阅读有关date_parser参数大熊猫文档,它似乎按预期方式工作(当然;))。所以我需要适应我的代码。我上面的例子是复制&从其他地方粘贴,我期望它的工作,因此,我的问题..我会报告回来,当我做我的代码适应。

EDIT2:

我的解析函数现在看起来是这样的,我想,代码工作现在。如果我还是做错了,请让我知道:

def parse(t): 
    ret = [] 
    for ts in t: 
     string_ = str(ts) 
     try: 
      tsdt = datetime.date(int(string_[:4]), int(string_[4:6]), int(string_[6:])) 
     except: 
      tsdt = datetime.date(1900,1,1) 
     ret.append(tsdt) 
    return ret 

回答

1

有六列,但只有五第一行中的标题。这就是为什么parse_dates失败。你可以跳过第一行:

df = pd.read_csv("tmp.csv", header=None, skiprows=1, parse_dates=[5]) 
2

你可以试试这个解析器:

parser = lambda x: pd.to_datetime(x, format='%Y%m%d', coerce=True) 

,并使用

df = pd.read_csv(filen, 
index_col=None, 
header=0, 
parse_dates=[5], 
date_parser=parser)