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

时间:2018-08-27 17:34:06

标签: python pandas

有什么方法可以直接检查数据框中是否缺少日期。 我想检查一下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

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

4 个答案:

答案 0 :(得分:6)

您可以使用DatetimeIndex.difference(other)

<div>
    <a>
        <div>
            <img src="https://cdn.pixabay.com/photo/2014/09/03/20/15/legs-434918_960_720.jpg" class="rounded float-right"/>
        </div>
    </a>
</div>

它返回另一个中不存在的元素

答案 1 :(得分:2)

示例:

作为一个最小的示例,请采取以下步骤:

>>> 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之间的缺失日期

方法1:

请参阅@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)

方法2:

您可以使用所需日期范围内的所有日期为数据框重新编制索引,并找到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的值是原始数据框中的缺失日期

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

答案 3 :(得分:0)

假设数据是每日非营业日期:

df.index.to_series().diff().dt.days > 1