Изменение вычисления столбца даты в фрейме данных pandas

#python #pandas

#python #pandas

Вопрос:

У меня есть фрейм данных, который выглядит следующим образом

введите описание изображения здесь

Мне нужно настроить time_in_weeks столбец для записи числа 34. Когда есть дубликат uniqueid с другим rma_created_date , это означает, что произошел какой-то сбой. Необходимо изменить 34, чтобы вычислить количество недель между новым самым последним rma_created_date (в данном случае 2020-10-15) и вычесть rma_processed_date из приведенной выше строки 2020-06-28.

Я надеюсь, что это имеет смысл с точки зрения того, что я пытаюсь сделать.

До сих пор я делал это

 def clean_df(df):
    '''
    This function will fix the time_in_weeks column to calculate the correct number of weeks
    when there is multiple failured for an item.
    '''
    
    # Sort by rma_created_date
    df = df.sort_values(by=['rma_created_date'])
 

Теперь мне нужно выполнить то, что я описал выше, но я немного запутался в том, как это сделать. Особенно учитывая, что у нас может быть несколько сбоев, а не только 2.

Я должен получить что-то вроде этого, возвращаемого в качестве вывода

введите описание изображения здесь

Как вы можете видеть, что произошло с 34 was, он был изменен, чтобы указать количество недель между 2020-10-15 и 2020-06-26

Вот еще один пример с большим количеством строк

введите описание изображения здесь

Используя предложенное выражение

 df['time_in_weeks']=np.where(df.uniqueid.duplicated(keep='first'),df.rma_processed_date.dt.isocalendar().week.sub(df.rma_processed_date.dt.isocalendar().week.shift(1)),df.time_in_weeks)
 

Я понимаю это

Последнее замечание: если есть дата 1/1/1900, не выполняйте никаких вычислений.

введите описание изображения здесь

Ответ №1:

Вопрос не очень понятен. Рад исправить, если я неправильно интерпретировал это.

Попробуйте использовать np.where(condition, choiceif condition, choice ifnotcondition)

 #Coerce dates into datetime
df['rma_processed_date']=pd.to_datetime(df['rma_processed_date'])
df['rma_created_date']=pd.to_datetime(df['rma_created_date'])

#Solution    

df['time_in_weeks']=np.where(df.uniqueid.duplicated(keep='first'),df.rma_created_date.sub(df.rma_processed_date),df.time_in_weeks)
 

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

1. Я добавил пример ожидаемого результата. Делает ли это более понятным?

2. Откуда берется 15?

3. Как вы можете видеть, что случилось с 34, оно было изменено на количество недель между 2020-10-15 и 2020-06-26.

4. 15 пришли, увидев, что, о, эй, похоже, у меня был еще один сбой в 2020-10-15, хорошо, хм, тогда мне нужно скорректировать 34 и взять количество недель между этой новой датой 2020-10-15 и когда мы закончили первую частоту сбоев, поэтому дата выше этой строки в столбце rma_processed_date. Имеет ли это смысл?

5. Не могли бы вы попробовать df['time_in_weeks']=np.where(df.uniqueid.duplicated(keep='first'),df.rma_processed_date.dt.isocalendar().week.sub(df.rma_processed_date.dt.isocalendar().week.shift(1)),df.time_in_weeks)