Панды - заполнение пропущенных дат между строками в Пандах без использования индекса даты - PullRequest
0 голосов
/ 07 марта 2019

У меня есть набор данных, полный предметов, которые проходят через различные статусы до принятия, многие из них проходят через один и тот же статус более одного раза, я хочу найти среднее время, в течение которого предмет проводит в статусе, перезапуская с 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.

Как добавить новые строки с отсутствующими датами, не используя индексацию дат?

...