2015-03-16 15 views
0

У меня есть кадр данных Pandas версии 0.12. Я пытаюсь преобразовать месяцы в строке series в текстовый формат, например. 04 = April, 05 = May. Мне пришлось работать с двумя разными версиями (12 против 13) Pandas, которые, похоже, имеют существенные изменения интерфейса.Pandas версия 0.12 to version 0.13 to_datetime несовместимость

df['date'] 
0 15/04/2013 
1 09/02/2015 
2 05/01/2015 
3 26/01/2015 
4 26/01/2015 
Name: date, dtype: object 

type(df['date'][0]) 
<type 'str'> 

Этот код работает с Pandas версии 0.13 и преобразует, например. 15/02/2015 до 15 February 2015, для каждой записи в series.

df.date = pd.to_datetime(df['date'], format="%d/%m/%Y").apply(lambda x: x.date().strftime('%d %B %Y')) 

Но выдает ошибку с версией 0.12:

File "/.../pandas/tseries/tools.py", line 124, in to_datetime values = _convert_listlike(arg.values, box=False) File "/.../pandas/tseries/tools.py", line 103, in _convert_listlike result = tslib.array_strptime(arg, format) File "tslib.pyx", line 1112, in pandas.tslib.array_strptime (pandas/tslib.c:18277) 
TypeError: expected string or buffer 

Мне просто нужно, чтобы это было сделано с, любые идеи о том, что панды 12 пробную выше код будет? Мне тоже не нужно использовать to_datetime(), поэтому любые альтернативные решения очень приветствуются!

EDIT:

Я попробовал эту вервь @ EdChum-х рекомендации:

df['date'] = df['date'].apply(lambda x: dt.datetime.strptime(x,'%d/%m/%Y')).apply(lambda x: x.date().strftime('%d %B %Y')) 

Но это дает ошибку:

File "/.../pandas/core/series.py", line 2536, in apply mapped = lib.map_infer(values, f, convert=convert_dtype) File "inference.pyx", line 864, in pandas.lib.map_infer (pandas/lib.c:42840) File " in <lambda> df['date'] = df['date'].apply(lambda x: dt.datetime.strptime(x,'%d/%m/%Y')).apply(lambda x: x.date().strftime('%d %B %Y')) TypeError: must be string, not float 

Я думаю, что это ответ @ комментарий JORIS как хорошо , похоже, проблема связана с частью .apply(). Я не понимаю, как/где в этой строке кода создается float ...

+1

Можете ли вы попробовать это, и если это сработает, я отправлю в качестве ответа: 'df ['date'] = df ['date']. Apply (lambda x: dt.datetime.strptime (x, '% d/% m /% Y ')) apply (lambda x: x.date(). strftime ('% d% B% Y ')) ' – EdChum

+0

Это работает для меня в pandas 0,12. Можете ли вы проверить, какая часть порождает ошибку? (часть 'to_datetime' или часть' apply') – joris

+0

@joris, из исключения (добавлено в вопрос), я считаю, что оно находится в 'to_datetime' – Rhubarb

ответ

1

Возможно, это связано с некоторыми недостающими значениями. Если вы используете dropna перед использованием to_datetime и apply(... strftime()), это сработает. Небольшой пример:

In [19]: df 
Out[19]: 
     date 
0 15/04/2013 
1 09/02/2015 
2   NaN 

In [21]: df['date2'] = df.date = pd.to_datetime(df['date'].dropna(), format="%d/ 
%m/%Y").apply(lambda x: x.date().strftime('%d %B %Y')) 

In [22]: df 
Out[22]: 
       date    date2 
0  15 April 2013  15 April 2013 
1 09 February 2015 09 February 2015 
2    NaN    NaN 

Причина разницы между панд 0,12 и 0,13, что в 0,12 to_datetime еще не мог справиться с этим, и, начиная с 0,13 она делает.