2016-01-23 82 views
6

我有這個foll。 dataframe:從熊貓數據框中刪除閏年一天

datetime 
2012-01-01 125.5010 
2012-01-02 125.5010 
2012-01-03 125.5010 
2012-02-04 125.5010 
2012-02-05 125.5010 
2012-02-29 125.5010 
2012-02-28 125.5010 
2016-01-07 125.5010 
2016-01-08 125.5010 
2016-02-29  81.6237 

我想刪除對應於2月29日的所有行,導致foll。數據幀:

datetime 
2012-01-01 125.5010 
2012-01-02 125.5010 
2012-01-03 125.5010 
2012-02-04 125.5010 
2012-02-05 125.5010 
2012-02-28 125.5010 
2016-01-07 125.5010 
2016-01-08 125.5010 

現在,我只是做手工:

df.drop(df.index[['2012-02-29']])。我怎樣才能讓它能夠運行多年,而無需手動指定行索引。

+1

這是非常相似對這個問題:http://stackoverflow.com/questions/30997007/pandas-dataframe-delete-specific-date-in-all-leap-years – EdChum

回答

4

IIUC你可以將其屏蔽和loc刪除:如果您的數據框已具有datetime列索引可以

def is_leap_and_29Feb(s): 
    return (s.index.year % 4 == 0) & 
      ((s.index.year % 100 != 0) | (s.index.year % 400 == 0)) & 
      (s.index.month == 2) & (s.index.day == 29) 

mask = is_leap_and_29Feb(df) 
print mask 
#[False False False False False True False False False True] 

print df.loc[~mask] 
#   datetime 
#2012-01-01 125.501 
#2012-01-02 125.501 
#2012-01-03 125.501 
#2012-02-04 125.501 
#2012-02-05 125.501 
#2012-02-28 125.501 
#2016-01-07 125.501 
#2016-01-08 125.501 
+0

這是一個遺憾,你編輯你的原始答案,它有更廣泛的適用性。 –

+0

沒問題,回滾是超級。謝謝。 – jezrael

10

df = df[~((df.index.month == 2) & (df.index.day == 29))] 

這應該刪除包含天月行所有年份都是29歲。

4

你可以看到日期string,看它是否與02-29結束:

df = df[~df.index.str.endswith('02-29')] 

使用這種方法,你可以使用任何字符串comparism方法類似contains