检查索引中是否有任何缺失日期

27

有没有直接检查数据框中缺失日期的方法。我想检查在2013-01-192018-01-29之间是否有缺失日期。

有没有直接检查数据框中缺失日期的方法?我想检查在2013-01-192018-01-29之间是否有缺失的日期。

            GWA_BTC      GWA_ETH    GWA_LTC  GWA_XLM  GWA_XRP
   Date                 
2013-01-19  11,826.36   1,068.45    195.00    0.51    1.82
2013-01-20  13,062.68   1,158.71    207.58    0.52    1.75
   ...
2018-01-28  12,326.23   1,108.90    197.36    0.48    1.55
2018-01-29  11,397.52   1,038.21    184.92    0.47    1.43

我尝试手动检查,但花费了很多时间。


1
@Yuca,数据中有一些随机缺失的日期。例如,在“2014-07-13”到“2014-07-19”之间缺失了约7天。同样,在数据中间也有一些缺失的日期。我们是否有办法知道缺失的日期而不是手动检查? - user_6396
是的,但您一年365天还是252天? - Yuca
@Yuca 365天。 - user_6396
2
你想知道只是有缺失日期还是缺失的具体日期是什么? - Yuca
@user456 也许你需要修改一下问题的描述,因为它的写法暗示了你想要一个布尔值。 - Stop harming Monica
显示剩余2条评论
5个回答

83
你可以使用 DatetimeIndex.difference(other)
pd.date_range(start = '2013-01-19', end = '2018-01-29' ).difference(df.index)
它返回另一个中不存在的元素。

只需将此作为我的答案的编辑(将删除)。但显然这是正确的方法! - sacuL
@sacul,哦,很棒。你的回答非常全面,应该保留它。 - Vaishali
21
这是我首先想到的事情。pd.date_range(df.index.min(), df.index.max()).difference(df.index) - piRSquared

4

示例:

作为一个极简例子,可以参考以下内容:

>>> df
              GWA_BTC   GWA_ETH  GWA_LTC  GWA_XLM  GWA_XRP
Date                                                      
2013-01-19  11,826.36  1,068.45   195.00     0.51     1.82
2013-01-20  13,062.68  1,158.71   207.58     0.52     1.75
2013-01-28  12,326.23  1,108.90   197.36     0.48     1.55
2013-01-29  11,397.52  1,038.21   184.92     0.47     1.43

我们可以找到 2013-01-192013-01-29 之间缺失的日期。

方法一:

请查看 @Vaishali 的回答

使用 .difference 查找您的日期时间索引与范围内所有日期的差异:

pd.date_range('2013-01-19', '2013-01-29').difference(df.index)

这将返回:

DatetimeIndex(['2013-01-21', '2013-01-22', '2013-01-23', '2013-01-24',
               '2013-01-25', '2013-01-26', '2013-01-27'],
              dtype='datetime64[ns]', freq=None)

方法二:

您可以使用所需日期范围内的所有日期重新索引您的数据框,并查找reindex插入NaN的位置。

要查找2013-01-192013-01-29之间缺失的日期:

>>> df.reindex(pd.date_range('2013-01-19', '2013-01-29')).isnull().all(1)

2013-01-19    False
2013-01-20    False
2013-01-21     True
2013-01-22     True
2013-01-23     True
2013-01-24     True
2013-01-25     True
2013-01-26     True
2013-01-27     True
2013-01-28    False
2013-01-29    False
Freq: D, dtype: bool

那些值为True的是你原始数据中缺失的日期。

我需要将索引转换为日期时间对象吗?目前索引的数据类型是对象。 - user_6396
是的,你应该这样做。 df.index = pd.to_datetime(df.index) - sacuL
方法一不起作用?它返回开始和结束之间的所有日期,而不是显示缺失的日期? - user_6396
不,它是有效的,但我划掉了它,因为@Vaishali已经使用那个解决方案回答了它。 - sacuL
如何保留原始列并将True/False作为新列添加?而不是替换原始列为True/False值。 - Vega

2
假设数据是每天的非工作日:
df.index.to_series().diff().dt.days > 1

1
您可以使用DatetimeIndex.difference并添加freq参数,以便检查缺失的日期、小时、分钟,具体取决于您正在使用的频率。
pd.date_range(df.index.min(), df.index.max(), freq="1min").difference(df.index)

0

我无法发表评论,但您可以遍历每个值并将24小时添加到前一个值,以查看日期是否匹配?

import pandas as pd

a = [1,2,3,4,5]
b = [1,0.4,0.3,0.5,0.2]

df = pd.DataFrame({'a':a , 'b': b})

for i in range(len(df)):
    prev = df.loc[i,'a']
    if i is 0:
        continue
    else:
         # Add 1 day to the current value and check with prev value

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接