2016-01-23 15 views
6

Mam foll. Dataframe:Usunąć rok przestępny z pandy danych o numerze

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 

Chciałbym upuścić wszystkie wiersze odpowiadające 29 lutego, w wyniku czego foll. Ramka danych:

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 

Teraz jestem po prostu robi to ręcznie:

df.drop(df.index[['2012-02-29']]). Jak mogę to zrobić, aby działał przez wszystkie lata, bez konieczności ręcznego określania indeksu wiersza.

+1

ten jest bardzo podobny na to pytanie: http://stackoverflow.com/questions/30997007/pandas-dataframe-delete-specific-date-in-all-leap-years – EdChum

Odpowiedz

4

IIUC można zamaskować go i usunąć przez 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 
+0

Szkoda, że ​​zredagowałeś swoją oryginalną odpowiedź, miała ona bardziej ogólne zastosowanie. –

+0

Nie ma problemu, wycofanie jest super. Dzięki. – jezrael

10

Jeśli dataframe już kolumnę datetime jako indeksu można:

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

powinno usunąć wiersze zawierające dzień lutego 29. na wszystkie lata.

4

Można zobaczyć datę jako string i sprawdzić, czy kończy się 02-29:

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

Stosując tę ​​metodę, można użyć dowolnej metody string-comparism jak contains itp

Powiązane problemy