检查日期是否连续

时间:2017-06-06 10:03:36

标签: python pandas

我有一个大熊猫数据框,其中包含检查日期作为索引以及物种的类别和类型。

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

2 个答案:

答案 0 :(得分:2)

您似乎需要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

答案 1 :(得分: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

因为对于Dog,您2017-01-03

之前会出现2016-10-03