【问题标题】:Remove leap year day from pandas dataframe从熊猫数据框中删除闰年
【发布时间】:2016-04-30 05:12:40
【问题描述】:

我知道了。数据框:

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']])。我怎样才能使它适用于所有年份,而无需手动指定行索引。

【问题讨论】:

标签: python pandas dataframe datetime


【解决方案1】:

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

【讨论】:

  • 很遗憾您编辑了原始答案,它具有更普遍的适用性。
  • 没问题,回滚超级棒。谢谢。
【解决方案2】:

你可以看到日期为string,看看它是否以02-29结尾:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 如果日期不是索引,则略有不同df = df[~((df['Date'].dt.month == 2) &(df['Date'].dt.day ==29))]
    猜你喜欢
    • 2021-12-18
    • 2016-08-14
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 2020-07-21
    • 2020-03-23
    相关资源
    最近更新 更多