проверить наличие недостающих дат в индексе

1

Есть ли способ проверить отсутствие дат в области данных напрямую. Я хочу проверить, отсутствуют ли даты между 2013-01-19 по 2018-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

Я попытался проверить это вручную, но это заняло много времени.

  • 0
    что вы имеете в виду под отсутствием? они рабочие дни?
  • 1
    @Yuca В данных случайно пропущены некоторые даты. Вроде около 7 дней не хватает с 2014-07-13 to 2014-07-19 . Точно так же между данными есть некоторые пропущенные даты. Есть ли способ узнать, какие даты отсутствуют, вместо проверки вручную?
Показать ещё 5 комментариев
Теги:
pandas

4 ответа

3
Лучший ответ

Вы можете использовать DatetimeIndex.difference (другое)

pd.date_range(start = '2013-01-19', end = '2018-01-29' ).difference(df.index)

Он возвращает элементы, не присутствующие в другом

  • 0
    Просто внесите это как правку в мой ответ (удаляю). Но ясно, что это путь!
  • 0
    @ Sacul, о, круто. Ваш ответ довольно полный, вы должны держать его
Показать ещё 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-19 и 2013-01-29

Способ 1:

См. Ответ @Вайшали

Используйте .difference чтобы найти разницу между вашим индексом datetime и множеством всех дат в пределах вашего диапазона:

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 s.

И чтобы найти отсутствующие даты между 2013-01-19 и 2013-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 - это недостающие даты в исходном фрейме данных

  • 0
    Должен ли я преобразовать индекс в объект datetime? на данный момент индекс типа d является объектом.
  • 0
    Да, ты должен. df.index = pd.to_datetime(df.index)
Показать ещё 3 комментария
0

при условии, что данные являются ежедневными нефинансовыми датами:

df.index.to_series().diff().dt.days > 1
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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню