2016-01-23 31 views
6

Tôi có foll. dataframe:Xóa ngày leap khỏi pandas dataframe

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 

Tôi muốn xóa tất cả các hàng tương ứng với ngày 29 tháng 2, dẫn đến foll. khung dữ liệu:

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 

Ngay bây giờ, tôi chỉ làm nó bằng tay:

df.drop(df.index[['2012-02-29']]). Làm thế nào tôi có thể làm cho nó để nó hoạt động cho tất cả các năm, mà không cần phải tự xác định chỉ số hàng.

+1

này rất giống cho câu hỏi này: http://stackoverflow.com/questions/30997007/pandas-dataframe-delete-specific-date-in-all-leap-years – EdChum

Trả lời

4

IIUC bạn có thể che giấu nó và loại bỏ bởi 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

Thật đáng tiếc là bạn đã chỉnh sửa câu trả lời gốc của mình, nó có khả năng ứng dụng chung hơn. –

+0

Không sao, rollback là siêu. Cảm ơn. – jezrael

10

Nếu dataframe của bạn đã có cột datetime như chỉ số bạn có thể:

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

này nên loại bỏ các hàng có chứa ngày tháng hai 29 cho tất cả các năm.

4

Bạn có thể thấy ngày như string và xem nếu nó kết thúc với 02-29:

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

Sử dụng phương pháp này, bạn có thể sử dụng bất kỳ phương pháp chuỗi comparism như contains vv