Pandas版本0.12到版本0.13 to_datetime不兼容

时间:2015-03-16 09:24:41

标签: python datetime pandas monthcalendar

我有一个Pandas版本0.12数据框。我正在尝试将字符串series中的月份转换为文本格式,例如04 = April05 = May。我最终不得不使用两个不同版本(12对13)的Pandas,它们似乎有很大的界面变化。

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 2015series

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

我只需要完成上述代码的Pandas 12版本的任何想法吗?我也不必使用to_datetime(),因此非常欢迎任何替代解决方案建议!

修改

我在@ 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 个答案:

答案 0 :(得分:1)

可能是由于一些缺失值。如果您在使用dropnato_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

pandas 0.12和0.13之间差异的原因是在0.12 to_datetime中还没有处理这个问题,并从0.13开始。