Используйте функцию numpy is_busday в столбце даты на Pandas DataFrame - PullRequest
0 голосов
/ 29 августа 2018

Я загружаю свой файл Excel в Dataframe Pandas, в файлах Excel есть столбец дат. после загрузки я конвертирую столбец даты в datetime64 [нс]

df['Date'] = pd.to_datetime(df['Date'])

Я создал новый столбец в кадре данных с именем «Is_Business_Day» В этом столбце я применил is_busday от Numpy, чтобы узнать, является ли дата днем ​​недели или выходным

Я пробовал оба кода, но не работал

df['Is_Business_Day']= [np.is_busday(np.datetime64(x)) for x in df['Date']]

и

df['Is_Business_Day']= [np.is_busday(x) for x in df['Date']]

Сообщение об ошибке:

TypeError: Iterator operand 0 dtype could not be cast from dtype('<M8[us]') to dtype('<M8[D]') according to the rule 'safe'

Пытался найти решение, но ничего не смог найти. Кто-нибудь может дать мне несколько советов? Благодарю.

1 Ответ

0 голосов
/ 29 августа 2018

Метод 1:

Преобразовать df['Date'] в строку перед тем, как передать np.is_busday:

df['Is_Business_Day'] = [np.is_busday(x) for x in df['Date'].astype(str)]

Метод 2:

Вы можете просто использовать pandas вместо numpy и проверить, находится ли Date в диапазоне рабочих дней от вашей минимальной даты до вашей максимальной даты:

bus_days = pd.bdate_range(df['Date'].min(), df['Date'].max())

df['Is_Business_Day'] = df['Date'].isin(bus_days)

Примеры:

>>> df = pd.DataFrame({'Date':pd.date_range(pd.to_datetime('today'), pd.to_datetime('2018-09-15'))})
>>> df
         Date
0  2018-08-29
1  2018-08-30
2  2018-08-31
3  2018-09-01
4  2018-09-02
5  2018-09-03
6  2018-09-04
7  2018-09-05
8  2018-09-06
9  2018-09-07
10 2018-09-08
11 2018-09-09
12 2018-09-10
13 2018-09-11
14 2018-09-12
15 2018-09-13
16 2018-09-14
17 2018-09-15

Вы можете сделать:

Метод 1 :

>>> df['Is_Business_Day'] = [np.is_busday(x) for x in df['Date'].astype(str)]
>>> df
         Date  Is_Business_Day
0  2018-08-29             True
1  2018-08-30             True
2  2018-08-31             True
3  2018-09-01            False
4  2018-09-02            False
5  2018-09-03             True
6  2018-09-04             True
7  2018-09-05             True
8  2018-09-06             True
9  2018-09-07             True
10 2018-09-08            False
11 2018-09-09            False
12 2018-09-10             True
13 2018-09-11             True
14 2018-09-12             True
15 2018-09-13             True
16 2018-09-14             True
17 2018-09-15            False

Метод 2 :

>>> bus_days = pd.bdate_range(df['Date'].min(), df['Date'].max())
>>> df['Is_Business_Day'] = df['Date'].isin(bus_days)
>>> df
         Date  Is_Business_Day
0  2018-08-29             True
1  2018-08-30             True
2  2018-08-31             True
3  2018-09-01            False
4  2018-09-02            False
5  2018-09-03             True
6  2018-09-04             True
7  2018-09-05             True
8  2018-09-06             True
9  2018-09-07             True
10 2018-09-08            False
11 2018-09-09            False
12 2018-09-10             True
13 2018-09-11             True
14 2018-09-12             True
15 2018-09-13             True
16 2018-09-14             True
17 2018-09-15            False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...