2015-06-16 124 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)