2016-01-13 53 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

你'重新老闆。謝謝 –