2015-02-14 1 views
2

Я пытаюсь читать CSV/текстовый файл со следующей структурой:Как правильно читать csv с датами и пропущенными ведущими нулями в пандах?

caseid eventdate  constype consid employid delta 
4044  13/11/1996 9   2301 3044  0 

Это то, что я уже знаю:

  1. caseid, consid и employid 8 значные строки (с ведущими нулями что не будет отображаться в текстовом файле)
  2. eventdate является дата дд/мм/гггг
  3. costype является строкой
  4. delta поплавкового

Теперь, что синтаксис панды, чтобы правильно прочитать этот CSV/текст, так что все столбцы правильно набранный?

Я использую это:

pd.read_csv(path, 
      types = {'caseid': np.char, 
        'eventdate': np.datetime64, 
        'constype': np.char, 
        'consid': np.char, 
        'employid': np.char, 
        'delta': np.float16}) 

Но это не может заботиться о датах и ​​ведущих нулей - любые мысли/предложения/помощь будет очень высокую оценку.

ответ

2

Следующая работал для меня, вам нужно пройти Dict как к парам dtype, типы должны быть типы, которые понятны, я бы передать str вместо char, а также, если вы передаете из параметров parse_dates=[1] вместо того, чтобы пытаться укажите его в dtypes, тогда pandas, встроенный в синтаксический анализатор даты, отлично разбирает строку даты.

Для заполнения нулей вы можете определить функцию для заполнения нулей и передать это параметру converters, передав dict столбцов и имя функции, для этих столбцов нет необходимости передавать dtype, будете судить по тому, будет преобразован в strpadZeros по:

def padZeros(x): 
    return str(x).zfill(8) 

df = pd.read_csv(path, sep='\s+', dtype = {'constype': str, 
        'delta': np.float16}, parse_dates=[1], 
        converters={'caseid':padZeros, 
           'consid':padZeros, 
           'employid':padZeros}) 

выход из df.info():

Int64Index: 1 entries, 0 to 0 
Data columns (total 6 columns): 
caseid  1 non-null object 
eventdate 1 non-null datetime64[ns] 
constype  1 non-null object 
consid  1 non-null object 
employid  1 non-null object 
delta  1 non-null float16 
dtypes: datetime64[ns](1), float16(1), object(4) 
memory usage: 50.0+ bytes 
None 

In [19]: 

df 
Out[19]: 
    caseid eventdate constype consid employid delta 
0 00004044 1996-11-13  9 00002301 00003044  0 
+0

он отлично работает - спасибо Ed! Я также добавил синтаксический анализатор даты (по-видимому, автопарсер не справляется с отсутствующими датами и, следовательно, возвращает строку: 'parse_dates = lambda x: date (2020, 1, 1), если x является np.nan else datetime.strptime (ул (х), '% d /% м /% Y') ' – rezakhorshidi

Смежные вопросы