У меня есть набор данных, полный предметов, которые проходят через различные статусы до принятия, многие из них проходят через один и тот же статус более одного раза, я хочу найти среднее время, в течение которого предмет проводит в статусе, перезапуская с 0, если он повторно входит в тот же статус на более позднем этапе). В частности, я хочу иметь возможность выбрать один момент времени и посмотреть общее среднее время, проведенное в этом состоянии.
Сначала это казалось достаточно простым, используя reindex
с параметром заполнения, который заполняет промежуточные / отсутствующие даты значениями, которые элемент имел на эту дату. Но у меня так много элементов и изменений, которые происходят в один и тот же день и т. Д., Что я не уверен, что смогу даже использовать для этого индекс даты.
Так что я думаю, что моя проблема отличается от этой и других подобных, поскольку у меня есть несколько точек данных, падающих в один и тот же момент времени. Если не считать недоразумение, я не могу использовать для этого индекс даты? Мои времена опускаются на второй уровень, возможно, я смогу использовать индекс даты на этом уровне, но тогда у меня будет огромный набор данных. Есть ли другой способ?
У меня есть пример набора данных здесь:
id Old Status New Status Status In Status Out
0 44 Draft Submit 2018-10-24 08:12:02 2018-10-24 18:12:02
1 44 Sumbit Return 2018-10-24 18:12:02 2018-11-24 08:56:02
2 44 Return Reject 2018-11-24 08:56:02 NaN
3 88 Submit Accept 2018-10-24 10:12:02 2018-10-29 13:17:02
4 88 Accept Develop 2018-10-29 13:17:02 NaN
5 90 Draft Submit 2018-12-30 08:43:12 NaN
6 95 Draft Reject 2019-01-24 06:12:02 Na
Если Status Out
равен NaN
, то в данный момент он находится в этом состоянии.
В качестве примера, взяв элемент 44
, между строкой 0
и строкой 1
я бы хотел, чтобы все дни с 24 октября по 24 ноября имели дату, равную дате в строке 0
.
Мои данные также представлены в следующем формате, с которым может быть проще работать.
df1 = pd.DataFrame({'id':[44,44,44,88,88,90,95],
'Old Status': ['Draft','Submit','Return','Submit','Accept',
'Draft','Draft'],
'New Status' : ['Submit','Return','Reject','Accept','Develop',
'Submit','Reject'],
'Datetime': ['2018-10-24 08:12:02',
'2018-10-24 18:12:02', '2018-11-24 08:56:02',
'2018-10-24 10:12:02','2018-10-29 13:17:02',
'2018-12-30 08:43:12', '2019-01-24 06:12:02']
}, columns = ['id','Old Status', 'New Status', 'Datetime'])
df1['Datetime'] = pd.to_datetime(df1['Datetime'])
df1
id Old Status New Status Datetime
0 44 Draft Submit 2018-10-24 08:12:02
1 44 Sumbit Return 2018-10-24 18:12:02
2 44 Return Reject 2018-11-24 08:56:02
3 88 Submit Accept 2018-10-24 10:12:02
4 88 Accept Develop 2018-10-29 13:17:02
5 90 Draft Submit 2018-12-30 08:43:12
6 95 Draft Reject 2019-01-24 06:12:02
редактирование:
Так что просто для подтверждения, мой набор данных имеет 278 дублированных значений времени индекса, снижающихся до уровня «s
». Поэтому, если я не перешел на уровень ns
, кажется, что я не могу использовать метод индекса даты, так как я получаю ошибку ValueError: cannot reindex from a duplicate axis
Использование ns
не было бы идеальным, так как это создало бы миллионы строк для размещения всего 278.
Как добавить новые строки с отсутствующими датами, не используя индексацию дат?