Разница во времени в минутах от столбца даты-времени в результате значений из другого столбца pandas

#python #pandas #dataframe #numpy

Вопрос:

У меня есть фрейм данных pandas в виде :

 datetime fault 2021-08-06T09:04:00 No 2021-08-06T09:05:00 No 2021-08-06T09:06:00 Yes 2021-08-06T09:07:00 Yes 2021-08-06T09:08:00 No  

Я хотел бы получить продолжительность времени в минутах, когда в столбце «Ошибка» было «ДА».

Таким образом, выход должен составлять 2 минуты, что составляет (2021-08-06T09:06:00 2021-08-06T09:07:00)

Комментарии:

1. Итак, вам нужен временной интервал от начала до того времени, когда fault он есть yes . Для первого yes это будет 2 , а для второго это будет 3 ?

2. Для первого Да это будет одна минута (2021-08-06T09:06:00 — 2021-08-06T09:05:00). Для второго да это также будет одна минута(2021-08-06T09:07:00 — 2021-08-06T09:06:00). Общее время ответа » да » теперь должно составлять 1 1 = 2 минуты

Ответ №1:

Сначала вам нужно преобразовать свой datetime столбец в объекты datetime.

 df["datetime"] = pd.to_datetime(df["datetime"], format="%Y-%m-%dT%H:%M:%S")  

Теперь мы должны найти индексы с "Yes" в fault столбце:

 indices = df.index[df['fault'] == "Yes"].tolist()  

Теперь мы можем повторить итерацию indices , чтобы найти столбец с "Yes" и предыдущим:

Примечание: Я не собираюсь проверять ошибки. Однако, когда индекс является 0 предыдущей строкой, не существует. И вы получите ошибку. Или займите последний ряд. Я не уверен.

Теперь мы получаем каждый индекс и предыдущий. Получите разницу во времени. И рассчитайте значение в минутах:

 for index in indices:  prev = df.iloc[index - 1]  current = df.iloc[index]  print(pd.Timedelta(current["datetime"] - prev["datetime"]).seconds/60)  

Может быть, вы сможете избавиться от prev и current и записать их прямо в строке расчета:

 for index in indices:  print(pd.Timedelta(df.iloc[index]["datetime"] - df.iloc[index - 1]["datetime"]).seconds/60)  

Поскольку мы рассчитали значения, мы можем добавить их, используя понимание списка:

 total_diffs = sum(  [  pd.Timedelta(df.iloc[index]["datetime"] - df.iloc[index - 1]["datetime"]).seconds/60  for index in indices  ] )  

Наконец, весь код будет:

 df["datetime"] = pd.to_datetime(df["datetime"], format="%Y-%m-%dT%H:%M:%S") indices = df.index[df['fault'] == "Yes"].tolist()   total_diffs = sum(  [  pd.Timedelta(df.iloc[index]["datetime"] - df.iloc[index - 1]["datetime"]).seconds/60  for index in indices  ] )