2016-01-13 67 views
1

我有一个包含以下列的大熊猫数据帧:如何将float/integer转换为带有strptime的日期?

col1 col2 
20040929 NaN 
NaN 20040925 

既既col1和col2上是float64(或Int64的)数字。 我想这些使用datetime.strptime()转换,但我得到的错误

"cannot convert the series to type 'float'"

,如果我将其转换为浮动,我得到的东西像20040929.0这strptime不明白。

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

+1

您需要使用'str()'将'float'转换为'string',然后再将它传递给'datetime.strptime()' – gtlambert

+0

yes我试过了,但是当我将它们转换为str时,它将日期转换为“ 20040929.0“... –

回答

3

您可以使用astype,然后applyto_datetime使用df str与格式字符串转换:

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到博克所以我们必须做到以下几点:如果我们比较在2K行DF 2种方法

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 

时序

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倍以上,它可能会随着向量化而变好得多

+0

优秀!!!那也能和datetime.strptime一起工作吗? –

+1

是的,但是它会变慢,因为你必须对每个元素进行操作,在这里我们对每个列使用'to_datetime'这是一个矢量化方法,列中的所有值都被转换而不是一次元素 – EdChum

+0

你'重新老板。谢谢 –