#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. Как я уже сказал, это второй подход. Формат вашей даты действительно неудобно сравнивать как строки…