2017-06-06 101 views
1

我有一個以檢查日期爲指標和物種類別和類型的熊貓數據框。檢查日期是否連續

Date Category Type 
2016-11-21 Cat Animal 
2016-11-21 Cat Animal 
2017-01-03 Cat Animal 
2016-11-01 Dog Animal 
2017-01-03 Dog Animal 
2016-10-03 Dog Animal 
2017-02-01 Dog Animal 
2017-03-01 Dog Animal 
2016-12-01 Dog Animal 
2016-11-21 Horse Animal 
2016-12-15 Horse Animal 
2017-02-04 Horse Animal 

我需要確定每個類別的日期是否連續。連續可能意味着一個月不見了,這在馬類中看到。一月份缺少馬匹,但總體而言馬匹的檢查更新正在增加。所以馬是有效的。 但是,貓在一天內收到兩次檢查無效。

最後的數據幀應該是

Date Category Type 
2016-11-01 Dog Animal 
2017-01-03 Dog Animal 
2016-10-03 Dog Animal 
2017-02-01 Dog Animal 
2017-03-01 Dog Animal 
2016-12-01 Dog Animal 
2016-11-21 Horse Animal 
2016-12-15 Horse Animal 
2017-02-04 Horse Animal 
+0

如果'2016 -11-21'被擊碎o'2016-12-17'那麼'Horse'無效? – jezrael

+0

你關心日期出現的順序嗎? – FLab

回答

1

看來你需要is_uniqueis_monotonic_increasingfilter

df = df.groupby('Category').filter(lambda x: x.index.is_unique and 
              x.index.is_monotonic_increasing) 
print (df) 
      Category Type 
Date      
2016-11-21 Horse Animal 
2016-12-15 Horse Animal 
2017-02-04 Horse Animal 
+0

但狗也應該有效 –

+0

然後使用'df.groupby('Category')。filter(lambda x:x.index.is_unique)' - 另一個答案。 – jezrael

+0

或者也許有必要更好地解釋如果連續==不是每個組的唯一索引值;) – jezrael

0

這裏是你如何排除動物該指數是不是唯一的:

df.groupby('Category').filter(lambda x: x.index.is_unique) 

這給所需的輸出:

  Category Type 
Date      
2016-11-01  Dog Animal 
2017-01-03  Dog Animal 
2016-10-03  Dog Animal 
2017-02-01  Dog Animal 
2017-03-01  Dog Animal 
2016-12-01  Dog Animal 
2016-11-21 Horse Animal 
2016-12-15 Horse Animal 
2017-02-04 Horse Animal 

你的問題會建議你想要日期嚴格增加,那麼你可以這樣做:

def index_diff(x): 
    return ((d_1 - d_0).days for d_1, d_0 in zip(x.index[1:], x.index[:-1])) 

df.groupby('Category').filter(lambda x: min(index_diff(x))> 0) 

雖然這只是回報

  Category Type 
Date      
2016-11-21 Horse Animal 
2016-12-15 Horse Animal 
2017-02-04 Horse Animal 

因爲對狗你有2017-01-03出現之前2016-10-03