2017-06-14 172 views
1

所以我有一個熊貓DATE_RANGE像這樣如何刪除日期從熊貓DATE_RANGE

dates = pd.date_range(start='2005-1-1', end='2014-12-31', freq='D') 

我想刪除所有來自閏年造成額外的天。

我做一個for循環

for each in index: 
    if each.month==2 and each.day==29: 
     print(each) # I actually want to delete this item from dates 

但我的問題是,我不知道如何刪除的項目。常規的python列表方法和函數不起作用。 我到處都在找。我查看了pandas.date_range的文檔,但沒有發現任何東西

任何幫助將不勝感激。

回答

3

您可能想要使用drop來刪除行。

import pandas as pd 
dates = pd.date_range(start='2005-1-1', end='2014-12-31', freq='D') 

leap = [] 
for each in dates: 
    if each.month==2 and each.day ==29: 
     leap.append(each) 

dates = dates.drop(leap) 
+0

謝謝。遮蔽效果很好。從來沒有想到。你有任何想法爲什麼matplotlib fill_between將不適用於pandas date_range作爲索引。不斷給我這個ufunc錯誤。 – Parousia

1

您可以嘗試創建兩個Series對象來分別存儲月份和日期並將它們用作蒙版。

dates = pd.date_range(start='2005-1-1', end='2014-12-31', freq='D') #All dates between range 
days = dates.day #Store all the days 
months = dates.month #Store all the months 

dates = dates[(days != 29) & (months != 2)] #Filter dates using a mask 

只是爲了檢查方法工作,如果你改變了!=條件==,我們可以看到你想要消除的日期。

UnwantedDates = dates[(days == 29) & (months == 2)] 

輸出:

DatetimeIndex(['2008-02-29', '2012-02-29'], dtype='datetime64[ns]', freq=None) 
+0

非常好的解決方案@Rakesh。也許如果你想要日期可以使用發生器快一點。 – Parousia

+1

@Parousia,這個__vectorized__解決方案應該比list/comprehention/generator /等更快。 – MaxU

+0

@Parousia,一般來說,在處理大熊貓和DataFrames時,我會避免不惜一切代價編寫一個循環。矢量化解決方案效率更高。 –

0

你可以試試:

dates = dates[~dates['Date'].str.contains('02-29')] 

在地方的Date你將不得不把那裏的日期存儲在列的名稱。

您不必使用for循環,因此運行速度更快。