如何使用strptime将float / integer转换为日期?

时间:2016-01-13 13:20:42

标签: python datetime pandas

我有一个包含以下列的pandas数据框:

col1 col2
20040929 NaN
NaN 20040925 

同时col1和col2都是float64(或int64)数字。 我试图使用datetime.strptime()转换这些,但我得到错误

  

“无法将系列转换为'float'类型”

如果我将它们转换为浮点数,我会得到像20040929.0这样strptime不理解的东西。

如何将这些列转换为日期呢? 非常感谢

1 个答案:

答案 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倍以上,因此它可以更好地扩展,因为它的矢量化