наименьшее значение, наименьшая дата, наименьшее время

#python #pandas #numpy #date

Вопрос:

У меня есть фрейм данных

 df = pd.DataFrame({"Transaction":["ett852741963", "ett123654789", "ett753951852", "ett159753852"],  "Arrival Scan":["02-11-2021 23:45:21", "", "05-11-2021 06:12:10", "04-11-2021 08:19:36"],  "Unloading Scan":["", "03-11-2021 06:14:22", "03-11-2021 11:41:22", "04-11-2021 14:45:21"],  "Unpacking Scan":["", "03-11-2021 8:02:11", "02-11-2021 15:01:02", ""],  "Delivery Scan":["04-11-2021 08:32:10", "", "03-11-2021 17:45:16", ""]})   df   Transaction Arrival Scan Unloading Scan Unpacking Scan Delivery Scan 0 ett852741963 02-11-2021 23:45:21 04-11-2021 08:32:10 1 ett123654789 03-11-2021 06:14:22 03-11-2021 8:02:11  2 ett753951852 05-11-2021 06:12:10 03-11-2021 11:41:22 02-11-2021 15:01:02 03-11-2021 17:45:16 3 ett159753852 04-11-2021 08:19:36 04-11-2021 14:45:21    

Я хочу выполнить сканирование в первый раз для каждой транзакции на основе сканирования от прибытия до сканирования доставки и отобразить его в столбце «Первый раз»

так что позже кадр данных станет

 Transaction Arrival Scan Unloading Scan Unpacking Scan Delivery Scan First Time 0 ett852741963 02-11-2021 23:45:21 04-11-2021 08:32:10 02-11-2021 23:45:21 1 ett123654789 03-11-2021 06:14:22 03-11-2021 8:02:11 03-11-2021 06:14:22    2 ett753951852 05-11-2021 06:12:10 03-11-2021 11:41:22 02-11-2021 15:01:02 03-11-2021 17:45:16 02-11-2021 15:01:02 3 ett159753852 04-11-2021 08:19:36 04-11-2021 14:45:21 04-11-2021 08:19:36  

Пожалуйста, помогите мне

Ответ №1:

Вы можете replace использовать пустую строку с nan , затем bfill и iloc для получения первых допустимых значений:

 df['First Time'] = df.iloc[:, 1:].replace("", np.nan).bfill(axis=1).iloc[:,0]  

С другой стороны, вы должны относиться к своим данным datetime как к данным datetime, а затем, используя свою структуру данных, вы можете просто использовать min :

 df.iloc[:,1] = df.iloc[:, 1:].apply(pd.to_datetime, errors='coerce', dayfirst=True)  df['First Time'] = df.iloc[:, 1:].min(axis=1)  

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

1. Что-то не так со сценарием ‘df[‘Первый раз’] = df.iloc[:, 1:].замените(«», np.nan).bfill(ось=1).iloc[:,0]’ . Смотрите, транзакция ett753951852 должна быть впервые 02-11-2021 15:01:02, а не 05-11-2021 06:12:10

2. О, сканирование при распаковке происходит раньше, чем сканирование по прибытии? Тогда вы определенно захотите использовать второй подход.

3. Да, в первый раз необходимо прочитать самое раннее время каждого сканирования. Если условие такое, то что это за сценарий?

4. Как я уже сказал, это второй подход. Формат вашей даты действительно неудобно сравнивать как строки…