2016-01-23 68 views
6

私はfollを持っています。データフレーム: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 

私はfollで、その結果、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

など、

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

この方法を使用すると、あなたはcontainsのように任意の文字列-comparismメソッドを使用することができますこの質問:http://stackoverflow.com/questions/30997007/pandas-dataframe-delete-specific-date-in-all-leap-years – EdChum

答えて

4

あなたはそれをマスクしlocにより削除することができIIUC:

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

この日2月含む行を削除する必要があります:あなたのデータフレームにすることができますインデックスとして既にdatetime列を持っている場合

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

これはあなたが元の回答を編集したのは残念ですが、より一般的な適用性がありました。 –

+0

問題はありませんが、ロールバックは優れています。ありがとう。 – jezrael

10

すべての年で29番目。

4

あなたはstringとして日付を見ると、それは02-29で終わるかどうかを確認することができます。これは非常に似ている

関連する問題