2016-05-02 3 views
1

Я пытаюсь прочитать файл с датами в формате (UK) 13/01/1800, однако некоторые даты датируются 1667 годом, которые не могут быть представлены наносекундой временная метка (см. http://pandas.pydata.org/pandas-docs/stable/gotchas.html#gotchas-timestamp-limits). Я понимаю, что с этой страницы мне нужно создать свой собственный PeriodIndex для покрытия диапазона, который мне нужен (см. http://pandas.pydata.org/pandas-docs/stable/timeseries.html#timeseries-oob), но я не могу понять, как преобразовать строку в csv-ривере в дату в этом индексе indexindex.Чтение CSV-файла в Pandas с историческими датами

До сих пор у меня есть:

span = pd.period_range('1000-01-01', '2100-01-01', freq='D') 
df_earliest= pd.read_csv("objects.csv", index_col=0, names=['Object Id', 'Earliest Date'], parse_dates=[1], infer_datetime_format=True, dayfirst=True) 

Как применить срок до даты считывания/преобразователя, поэтому я могу создать столбец PeriodIndex/DateTimeIndex в dataframe?

+0

Я думаю, что лучше всего загружать и стирать косые черты, тогда вы можете использовать метод в этой ссылке для создания periodindex, поэтому после загрузки выполните 'df ['Самая ранняя дата'] = df ['Самая ранняя дата' ] .str.replace ('\\', '') 'поэтому я не буду передавать параметр parse_dates' в' read_csv', чтобы читать эти значения в виде строк – EdChum

ответ

0

вы можете попробовать сделать это следующим образом:

fn = r'D:\temp\.data\36987699.csv' 

def dt_parse(s): 
    d,m,y = s.split('/') 
    return pd.Period(year=int(y), month=int(m), day=int(d), freq='D') 


df = pd.read_csv(fn, parse_dates=[0], date_parser=dt_parse) 

входного файла:

Date,col1 
13/01/1800,aaa 
25/12/1001,bbb 
01/03/1267,ccc 

Тест:

In [16]: df 
Out[16]: 
     Date col1 
0 1800-01-13 aaa 
1 1001-12-25 bbb 
2 1267-03-01 ccc 

In [17]: df.dtypes 
Out[17]: 
Date object 
col1 object 
dtype: object 

In [18]: df['Date'].dt.year 
Out[18]: 
0 1800 
1 1001 
2 1267 
Name: Date, dtype: int64 

PS Вы можете добавить try ... catch блок в dt_parse() функция для ловли ValueError: исключений - результат int() ...

+0

Я обернул его с помощью try/except возвращает pd.NaT для недопустимых строк даты (в противном случае сбой разбивается). – Richard

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