Pandas 版本 0.12 到版本 0.13 to_datetime 不兼容
Pandas version 0.12 to version 0.13 to_datetime incompatibility
我有一个 Pandas 版本 0.12 数据框。我正在尝试将字符串 series
中的月份转换为文本格式,例如04 = April
、05 = May
。我最终不得不使用 Pandas 的两个不同版本(12 对 13),它们的界面似乎有很大的变化。
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
我只需要完成这项工作,关于上述代码的 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()
部分。我不明白 how/where 在这行代码中创建了一个 float
...
可能是因为一些缺失值。如果您在使用 to_datetime
和 apply(... strftime())
之前使用 dropna
,这将起作用。一个小例子:
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 开始它可以。
我有一个 Pandas 版本 0.12 数据框。我正在尝试将字符串 series
中的月份转换为文本格式,例如04 = April
、05 = May
。我最终不得不使用 Pandas 的两个不同版本(12 对 13),它们的界面似乎有很大的变化。
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
我只需要完成这项工作,关于上述代码的 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()
部分。我不明白 how/where 在这行代码中创建了一个 float
...
可能是因为一些缺失值。如果您在使用 to_datetime
和 apply(... strftime())
之前使用 dropna
,这将起作用。一个小例子:
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 开始它可以。