В составе модуля Pandas есть очень удобный функционал для чтения CSV-файлов. К сожалению, большинство примеров работы с ним предполагают что одна физическая колонка в CSV-файле соответствует одной логической записи в DataFrame. Предположение отличное, но я сходу наткнулся на то, что дата разнесена по нескольким столбцам, а не записана в формате типа
data = """\
2011,1,10,AAPL,Buy,1500,
2011,1,13,AAPL,Sell,1500,
2011,1,13,IBM,Buy,4000,
"""
2011,1,10,AAPL,Buy,1500,
2011,1,13,AAPL,Sell,1500,
2011,1,13,IBM,Buy,4000,
"""
Примитивные решения со считыванием в существующем формате с последующей конверсией или построчным чтением с преобразованием, пусть и подходили для моего случая, но выглядели очень уж “не спортивно”, посему были отброшены сразу. И это было верно, так как правильное решение оказалось очень простым и элегантным:
import pandas.io.parsers as pp
from cStringIO import StringIO
pp.read_csv(StringIO(data), names=["year", "month", "day", "symbol", "op", "count", "NA"],
parse_dates={'date':["year", "month", "day"]})
from cStringIO import StringIO
pp.read_csv(StringIO(data), names=["year", "month", "day", "symbol", "op", "count", "NA"],
parse_dates={'date':["year", "month", "day"]})
Что даст нам правильно представленные данные:
date symbol op count NA
0 2011-01-10 00:00:00 AAPL Buy 1500 NaN
1 2011-01-13 00:00:00 AAPL Sell 1500 NaN
2 2011-01-13 00:00:00 IBM Buy 4000 NaN
0 2011-01-10 00:00:00 AAPL Buy 1500 NaN
1 2011-01-13 00:00:00 AAPL Sell 1500 NaN
2 2011-01-13 00:00:00 IBM Buy 4000 NaN