从pandas数据框中删除闰年日期

16

我有以下数据框:

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日的行,结果是以下数据框:

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
3个回答

23

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

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

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


3
如果日期不是索引,则稍微改变一下代码:df = df[~((df['Date'].month == 2) &(df['Date'].day ==29))]该代码意思为:从数据框中删除所有日期为2月29日的行。 - Sandeep Singhal

8
你可以使用掩码来移除布尔索引:

您可以掩盖它并删除 布尔索引

df = df[(df.index.month != 2) | (df.index.day != 29)]

使用函数的解决方案:

def is_leap_and_29Feb(s):
    return (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

或:

(s.index.month != 2) | (s.index.day != 29)


很遗憾你编辑了原始答案,它具有更广泛的适用性。 - Fabio Lamanna
没问题,回滚非常好用。谢谢。 - jezrael

7
您可以查看日期是否以02-29结尾,并将其视为string类型:
df = df[~df.index.str.endswith('02-29')]

使用这种方法,您可以使用任何字符串比较方法,如contains等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接