从pandas数据框中删除闰年

use*_*827 11 python dataframe pandas

我有这个人.数据帧:

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
Run Code Online (Sandbox Code Playgroud)

我想删除对应于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
Run Code Online (Sandbox Code Playgroud)

现在,我只是手动完成:

df.drop(df.index[['2012-02-29']]).我怎样才能使它适用于所有年份,而不必手动指定行索引.

Fab*_*nna 14

如果您的数据框已经将datetime列作为索引,您可以:

df = df[~((df.index.month == 2) & (df.index.day == 29))]
Run Code Online (Sandbox Code Playgroud)

这应该删除所有年份包含2月29日那天的行.

  • 如果日期不是索引,则略有不同 `df = df[~((df['Date'].dt.month == 2) &(df['Date'].dt.day ==29)) ]` (3认同)

jez*_*ael 6

IIUC你可以掩饰它并删除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
Run Code Online (Sandbox Code Playgroud)


Mar*_*ger 6

您可以查看日期string,看看它是否以02-29:

df = df[~df.index.str.endswith('02-29')]
Run Code Online (Sandbox Code Playgroud)

使用此方法,您可以使用任何字符串比较方法,如contains,等.