#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 ] )