np.where условие первый экземпляр в порядке, второй экземпляр выдает ошибку - PullRequest
0 голосов
/ 08 октября 2019

У меня есть фрейм данных pandas, в котором есть столбец даты, содержащий даты с датами первого дня («европейские») и первого месяца (американские). У меня есть отдельный столбец типа int, содержащий значения 'year'. Строки даты df.year <2017 являются первыми месяцами, а строки df.year> 2017 - первыми.

Я использую условие np.where, чтобы отделить месяц и день от строк датыв отдельные столбцы, чтобы построить дату и время после этого. Итак, у меня есть эти данные:

'year' 'number' 'date'
2016    75  01/05/2017 00:00
2016    75  01/06/2017 00:00
2016    75  01/06/2017 00:00
2016    75  01/06/2017 00:00
2016    75  01/06/2017 00:00
2016    75  01/09/2017 00:00
2016    75  01/09/2017 00:00
2016    75  01/10/2017 00:00
2016    75  01/10/2017 00:00
2017    0   01/01/2017 00:00
2017    0   01/01/2017 00:00
2017    0   01/01/2017 00:00
2017    0   01/01/2017 00:00
2017    0   02/01/2017 00:00
2017    0   03/01/2017 00:00
2017    0   04/01/2017 00:00
2017    0   04/01/2017 00:00
2017    0   04/01/2017 00:00
2017    0   04/01/2017 00:00
2017    0   05/01/2017 00:00

Я уже использовал это для создания значений месяца:

df['dt_mo'] = np.where(df.year<2017,df.date.str.extract(r'(\d+)\/\d+\/\d+'), df.date.str.extract(r'\d+\/(\d+)\/\d+'))

Это прекрасно работает для удаления месяца. Я пробовал и другие методы, но так как ['year'] имеет тип (int), это работает нормально

Однако, когда я пытаюсь выполнить аналогичный процесс для извлечения значения дня, выдается ошибка.

Я попытался перевернуть оператор «больше / меньше», а также поменять местами группы захвата.

(1)sl['dt_dy'] = np.where(sl.year>2017, sl.date.str.extract(r'(\d+)\/\d+\/\d+'),sl.date.str.extract(r'\d+\/(\d+)\/\d+'))

или

(2)df['dt_dy'] = np.where(df.year<2017,df.date.str.extract(r'\d+\/(\d+)\/\d+'), df.date.str.extract(r'(\d+)\/\d+\/\d+'))

Оба возвращают следующую общую ошибку:«ValueError: неверное количество пропущенных элементов 2, размещение подразумевает 1».

В идеале df.dt_dy должен возвращать значение дня, так же как df.dt_mo в настоящее время возвращает значение месяца.

Как всегда, был бы более признателен за любые чистые подходы

Спасибо

1 Ответ

0 голосов
/ 08 октября 2019

Кажется, вы в конечном итоге захотите сделать datetime, поэтому создайте его с самого начала, указав np.where с указанием различных форматов. Если вам нужны дни, вы можете использовать аксессоры datetime.

import numpy as np
import pandas as pd

df['my_date'] = np.where(df.year < 2017, 
                         pd.to_datetime(df.date, format='%m/%d/%Y %H:%M', errors='coerce'),
                         pd.to_datetime(df.date, format='%d/%m/%Y %H:%M', errors='coerce'))

    year  number              date    my_date
0   2016      75  01/05/2017 00:00 2017-01-05
1   2016      75  01/06/2017 00:00 2017-01-06
2   2016      75  01/06/2017 00:00 2017-01-06
3   2016      75  01/06/2017 00:00 2017-01-06
4   2016      75  01/06/2017 00:00 2017-01-06
5   2016      75  01/09/2017 00:00 2017-01-09
6   2016      75  01/09/2017 00:00 2017-01-09
7   2016      75  01/10/2017 00:00 2017-01-10
8   2016      75  01/10/2017 00:00 2017-01-10
9   2017       0  01/01/2017 00:00 2017-01-01
10  2017       0  01/01/2017 00:00 2017-01-01
11  2017       0  01/01/2017 00:00 2017-01-01
12  2017       0  01/01/2017 00:00 2017-01-01
13  2017       0  02/01/2017 00:00 2017-01-02
14  2017       0  03/01/2017 00:00 2017-01-03
15  2017       0  04/01/2017 00:00 2017-01-04
16  2017       0  04/01/2017 00:00 2017-01-04
17  2017       0  04/01/2017 00:00 2017-01-04
18  2017       0  04/01/2017 00:00 2017-01-04
19  2017       0  05/01/2017 00:00 2017-01-05
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...