2015-06-16 9 views
0

Я пытаюсь прочитать файл csv, который включает даты. CSV выглядит следующим образом:pandas parse датируется 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 всегда заканчивается в исключающем блоке, потому что int(string_[:4]) содержит скобку, которая, не может быть преобразован в int. Функция синтаксического анализа построена для одновременного анализа только одной даты (например, 20150420).

Что я делаю неправильно?

EDIT:

хорошо, я только что прочитал в панд документ о 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)