Как проверить столбец Pandas Datetime на наличие пропущенных значений? - PullRequest
0 голосов
/ 19 февраля 2020

Я должен проверить некоторые данные с прибора и убедиться, что нет пропущенных временных интервалов. Так, например, у меня есть Dataframe, подобный этому:

enter image description here

Я попытался сгенерировать новый ряд даты-времени с pd.date_range('2020-02-17 10:29:25', periods=1440, freq='T') и попытался сравнить его , Но я застрял.

Ответы [ 3 ]

1 голос
/ 19 февраля 2020

Вы можете поместить Datetime в новый столбец, но сместить одну строку вниз, чтобы у вас было два значения в одной строке, и вы можете вычесть их и проверить, если результат больше 1 минуты.

import pandas as pd
import datetime

data = {'Datetime': [
    '2020-02-17 10:29:25',
    '2020-02-17 10:30:25',
    '2020-02-17 10:31:25',
    '2020-02-17 10:45:25',    
    '2020-02-17 10:46:25',    
]}

df = pd.DataFrame(data)
df['Datetime'] = pd.to_datetime(df['Datetime'])

df['DT2'] = df['Datetime'].shift(1)
df['diff'] = df['Datetime'] - df['DT2']

# all values

print(df)

# compare with 1 minut

print(df[df['diff'] > datetime.timedelta(seconds=60)])

Результат

# all values

             Datetime                 DT2     diff
0 2020-02-17 10:29:25                 NaT      NaT
1 2020-02-17 10:30:25 2020-02-17 10:29:25 00:01:00
2 2020-02-17 10:31:25 2020-02-17 10:30:25 00:01:00
3 2020-02-17 10:45:25 2020-02-17 10:31:25 00:14:00
4 2020-02-17 10:46:25 2020-02-17 10:45:25 00:01:00

# compare with 1 minut

             Datetime                 DT2     diff
3 2020-02-17 10:45:25 2020-02-17 10:31:25 00:14:00

РЕДАКТИРОВАТЬ: см. Ответ @luigigi для более простой версии, которая использует

df[ df['Datetime'].diff() > pd.Timedelta('60s') ]
1 голос
/ 19 февраля 2020

Вы можете попытаться создать диапазон дат и проверить, какие значения отсутствуют в столбце DataFrame. Например:

df=pd.DataFrame({'Datetime':[*pd.date_range('2020-02-17 10:29:25', periods=3, freq='T'), *pd.date_range('2020-02-17 10:49:25', periods=3, freq='T')]})
df
             Datetime
0 2020-02-17 10:29:25
1 2020-02-17 10:30:25
2 2020-02-17 10:31:25
3 2020-02-17 10:49:25
4 2020-02-17 10:50:25
5 2020-02-17 10:51:25

my_range = pd.date_range(start=df['Datetime'].min(), end=df['Datetime'].max(), freq='T')

my_range[~my_range.isin(df['Datetime'])]
DatetimeIndex(['2020-02-17 10:32:25', '2020-02-17 10:33:25',
               '2020-02-17 10:34:25', '2020-02-17 10:35:25',
               '2020-02-17 10:36:25', '2020-02-17 10:37:25',
               '2020-02-17 10:38:25', '2020-02-17 10:39:25',
               '2020-02-17 10:40:25', '2020-02-17 10:41:25',
               '2020-02-17 10:42:25', '2020-02-17 10:43:25',
               '2020-02-17 10:44:25', '2020-02-17 10:45:25',
               '2020-02-17 10:46:25', '2020-02-17 10:47:25',
               '2020-02-17 10:48:25'],
              dtype='datetime64[ns]', freq='T')

Или вы можете использовать это (вдохновленный @furas):

df_missing = df[df['Datetime'].diff()>pd.Timedelta('60s')]
df_missing['diff'] = df.diff()
df_missing

             Datetime     diff
3 2020-02-17 10:49:25 00:18:00
0 голосов
/ 19 февраля 2020

Проверьте, что каждая строка -1 мин по сравнению со следующей, и затем сделайте что-нибудь, если это не так.

for i in range(len(df.index)-1):
   if datetime.datetime.strptime(df.loc[i, 'DateTime'], '%Y-%m-%d %H:%M:%S) != datetime.datetime.strptime(df.loc[i+1, 'DateTime'], '%Y-%m-%d %H:%M:%S) + datetime.timedelta(minutes=1):
      print('Data missing')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...