Eliminar el día bisiesto de los datos de los pandas.

Tengo los folletos. 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 

Me gustaría eliminar todas las filas correspondientes al 29 de febrero, lo que resulta en seguidores. 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-28 125.5010 2016-01-07 125.5010 2016-01-08 125.5010 

En este momento, solo lo estoy haciendo manualmente:

df.drop(df.index[['2012-02-29']]) . ¿Cómo puedo hacer que funcione para todos los años, sin tener que especificar manualmente el índice de filas?

IIUC puedes enmascararlo y eliminarlo por loc :

 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 

Si su dataframe ya tiene la columna de datetime como índice, puede:

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

Esto debería eliminar las filas que contienen el día 29 de febrero para todos los años.

Puede ver la fecha como una string y ver si termina con 02-29 :

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

Usando este método, puedes usar cualquier método de comparación de cadenas como lo contains , etc.