我有一个包含以下列的pandas数据框:
col1 col2
20040929 NaN
NaN 20040925
同时col1和col2都是float64(或int64)数字。 我试图使用datetime.strptime()转换这些,但我得到错误
“无法将系列转换为'float'类型”
如果我将它们转换为浮点数,我会得到像20040929.0这样strptime不理解的东西。
如何将这些列转换为日期呢? 非常感谢
答案 0 :(得分:3)
您可以使用astype
将{d}转换为str
,然后使用格式字符串将apply
to_datetime
转换为<{p}}
In [190]:
df.astype(str).apply(lambda x: pd.to_datetime(x, format='%Y%m%d'))
Out[190]:
col1 col2
0 2004-09-29 NaT
1 NaT 2004-09-25
修改强>
使用strptime
会更慢且不那么友好,首先转换为str
会引入.0
,因为dtype是浮点数,我们必须拆分,另外strptime
不会理解Series
,因此我们必须致电applymap
。在此NaN
之上会导致strptime
bork,因此我们必须执行以下操作:
In [203]:
def func(x):
try:
return dt.datetime.strptime(x.split('.')[0], '%Y%m%d')
except:
return pd.NaT
df.astype(str).applymap(func)
Out[203]:
col1 col2
0 2004-09-29 NaT
1 NaT 2004-09-25
<强>计时强>
如果我们比较2K行df上的2种方法:
In [212]:
%timeit df.astype(str).apply(lambda x: pd.to_datetime(x, format='%Y%m%d'))
100 loops, best of 3: 8.11 ms per loop
In [213]:
%%timeit
def func(x):
try:
return dt.datetime.strptime(x.split('.')[0], '%Y%m%d')
except:
return pd.NaT
df.astype(str).applymap(func)
10 loops, best of 3: 86.3 ms per loop
我们观察到pandas
方法的速度提高了10倍以上,因此它可以更好地扩展,因为它的矢量化