Как привести столбцы времени и найти временную дельту с условием в python pandas

У меня есть столбец Time, который не является нулевым объектом, и я не могу преобразовать его в timedelta или datetime.

     Time             msg
12:29:36.306000      Setup
12:29:36.507000      Alerting
12:29:38.207000      Service
12:29:39.194000      Setup
12:30:05.773000      Alerting
12:30:06.205000      Service
12:32:07.315000      Setup
12:32:17.194000      Service
12:32:26.889000      Setup
12:36:06.274000      Alerting
12:36:08.523000      Service
12:37:59.200000      Setup
12:47:10.652000      Alerting
12:47:43.921000      Setup

Когда я набираю df.info(), я получаю, что столбец «Время» не является нулевым объектом, и я не могу преобразовать его в timedelta или datetime (для этого очевидно, почему я не могу этого сделать). Итак, каково решение, чтобы найти разницу между последовательными сообщениями (дельта времени), но если дельта времени ‹ 5 секунд, чем пройти. Выход:

     Time             msg         diff
12:29:36.306000      Setup         
12:29:36.507000      Alerting      
12:29:38.207000      Service
12:29:39.194000      Setup
12:30:05.773000      Alerting
12:30:06.205000      Service
12:32:07.315000      Setup
12:32:17.194000      Service
12:32:26.889000      Setup
12:36:06.274000      Alerting    6.30***
12:36:08.523000      Service     
12:37:59.200000      Setup
12:47:10.652000      Alerting    11.02***    
12:47:43.921000      Setup      

Я пробовал что-то вроде этого:

df['diff'] = (df['Time']df['Time'].shift()).fillna(0)

Но я не знал, как написать условие для интервала 5 секунд.


person jovicbg    schedule 15.08.2017    source источник
comment
Если использовать df['Time'] = pd.to_timedelta(df['Time']), он возвращает ошибку?   -  person jezrael    schedule 15.08.2017
comment
Да. ValueError: неверный тип для скаляра timedelta: ‹type 'datetime.time'›   -  person jovicbg    schedule 15.08.2017
comment
Затем используйте df['Time'] = pd.to_timedelta(df['Time'].astype(str))   -  person jezrael    schedule 15.08.2017


Ответы (1)


Я думаю, сначала нужно преобразовать в str, а затем вызвать to_timedelta.

Затем получите diff и сравните с 5s.

Последний для нового столбца используйте mask по маске :

df['Time'] = pd.to_timedelta(df['Time'].astype(str))

df['diff'] = df['Time'].diff()
df['mask'] = df['Time'].diff() > pd.Timedelta(5, unit='s')
print (df)
              Time       msg            diff   mask
0  12:29:36.306000     Setup             NaT  False
1  12:29:36.507000  Alerting 00:00:00.201000  False
2  12:29:38.207000   Service 00:00:01.700000  False
3  12:29:39.194000     Setup 00:00:00.987000  False
4  12:30:05.773000  Alerting 00:00:26.579000   True
5  12:30:06.205000   Service 00:00:00.432000  False
6  12:32:07.315000     Setup 00:02:01.110000   True
7  12:32:17.194000   Service 00:00:09.879000   True
8  12:32:26.889000     Setup 00:00:09.695000   True
9  12:36:06.274000  Alerting 00:03:39.385000   True
10 12:36:08.523000   Service 00:00:02.249000  False
11 12:37:59.200000     Setup 00:01:50.677000   True
12 12:47:10.652000  Alerting 00:09:11.452000   True
13 12:47:43.921000     Setup 00:00:33.269000   True

df['Time'] = pd.to_timedelta(df['Time'])
diff = df['Time'].diff()
mask = df['Time'].diff() > pd.Timedelta(5, unit='s')
df['new'] = diff.where(mask)
print (df)
              Time       msg             new
0  12:29:36.306000     Setup             NaT
1  12:29:36.507000  Alerting             NaT
2  12:29:38.207000   Service             NaT
3  12:29:39.194000     Setup             NaT
4  12:30:05.773000  Alerting 00:00:26.579000
5  12:30:06.205000   Service             NaT
6  12:32:07.315000     Setup 00:02:01.110000
7  12:32:17.194000   Service 00:00:09.879000
8  12:32:26.889000     Setup 00:00:09.695000
9  12:36:06.274000  Alerting 00:03:39.385000
10 12:36:08.523000   Service             NaT
11 12:37:59.200000     Setup 00:01:50.677000
12 12:47:10.652000  Alerting 00:09:11.452000
13 12:47:43.921000     Setup 00:00:33.269000
person jezrael    schedule 15.08.2017
comment
Смотря какой вопрос - может да, а может и нет надо создавать новую тему. - person jezrael; 15.08.2017
comment
У меня есть еще один вопрос, если вы не возражаете. Я могу создать новую тему Q. Что делать, если мне нужно использовать это 5-секундное условие только в том случае, если у меня есть два значения «Настройка» сообщения без значения «Предупреждение» между ними. В случае, если Alerting находится между двумя значениями Setup в msg, просто рассчитайте timedelta, как обычно. Например, седьмая и восьмая строки в вашем коде будут NaT, а остальные будут иметь временную дельту. - person jovicbg; 15.08.2017
comment
Кажется, это не так просто, может быть, вы можете создать новый вопрос. Почему не выбрана 6,7,8 строка? - person jezrael; 15.08.2017