2016-02-18 30 views
3

我試圖使用lambda和strftime像下面使用的時候有空值(熊貓)日期拉姆達和strftime

df['Date Column'] = df['Date Column'].map(lambda x: x.strftime('%m/%d/%Y')) 

但是改變我的數據幀中的日期時間列的格式,因爲我有在這些字段中的一些空值,這給了我一個錯誤。我不能刪除這些空行,因爲我仍然需要它們來處理其他列中的數據。有沒有辦法解決這個錯誤,而不刪除空值。

也許類似

df['Date Column'].map(lambda x: x.strftime('%m/%d/%Y') if x != null else "") 

我使用的方法是刪除空值,格式化列,然後將其合併回原始數據集,但這似乎是一種非常低效的方法。

+1

「也許類似....」這就是我正在建議的。它有用嗎? –

+0

它並不可悲。我嘗試過不同的形式。 .notnull(),!= np.nan,!=「NaT」,!=「NaN,但他們都沒有工作,所以我想知道如果方法是錯的 – FortuneFaded

回答

4

你應該不檢查楠/ NAT(UN)的平等,而是應該.notnull()工作,它確實對我來說:

s = pd.date_range('2000-01-01', periods=5).to_series().reset_index(drop=True) 
s[2] = None 
s 

0 2000-01-01 
1 2000-01-02 
2   NaT 
3 2000-01-04 
4 2000-01-05 
dtype: datetime64[ns] 

s.map(lambda x: x.strftime('%m/%d/%Y') if pd.notnull(x) else '') 

0 01/01/2000 
1 01/02/2000 
2    
3 01/04/2000 
4 01/05/2000 
dtype: object 

這將返回相同的答案被@Alexander和@蝙蝠俠,但更明確。對於大型系列,它可能也會稍微慢一點。

或者,您可以使用.dt訪問器。空值將被格式化爲NaT

s.dt.strftime('%m/%d/%Y') 

0 01/01/2000 
1 01/02/2000 
2   NaT 
3 01/04/2000 
4 01/05/2000 
dtype: object 
+0

這一個爲我工作。謝謝! – FortuneFaded

2

就我個人而言,我只是定義一個小函數,然後使用它。

def to_string(date): 
    if date: 
     string = date.strftime('%Y%m%d') 
    else: 
     string = "" 

    return string 

然後

df['Date Column'].map(to_string) 

否則

df['Date Column'].map(lambda x: x.strftime('%Y%m%d') if x else "") 
+0

你是什麼意思否則?...你剛剛複製了我的答案!!! – Alexander

+0

對不起,我開始編輯我的答案時沒有回答 我更喜歡函數定義,因爲我認爲它更易於閱讀,這就是爲什麼我以「個人」開頭的原因。 – Batman

+0

這兩種方法最終都給了我與空值相同的錯誤,Goyo的解決方案適用於我,所以我將標記爲答案 – FortuneFaded

1

可以使用有條件分配(三元)。

df['Date Column'] = df['Date Column'].map(lambda x: x.strftime('%m/%d/%Y') if x else '') 
+0

由於某種原因,方法仍然給我與空值相同的錯誤Goyo的解決方案爲我工作,所以我將標記爲答案 – FortuneFaded

+1

我想這取決於你的意思是「在這些領域的一些空值」(否ne vs. NaT vs. NaN)。我假設沒有,但使用notnull()包括其他情況。樣本數據有助於創建符合您要求的更好的解決方案。 – Alexander

+0

啊,你完全正確。這是NaT,因爲它是日期時間格式,我對此表示歉意。 – FortuneFaded