Используйте функцию numpy is_busday для столбца даты в Pandas DataFrame

1

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

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

Я создал новый столбец Dataframe под названием "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'

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

Теги:
pandas
numpy

1 ответ

2
Лучший ответ

Способ 1:

Преобразуйте df['Date'] в строку перед тем, как np.is_busday ее 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
  • 0
    преобразование дня в строку делает трюк с NumPy. Интересно, как получается, что функция numpy не работает с этим типом pandas datetime? Я напечатал d-тип dataframe, и он показывает, что тип даты правильный datetime64 [нс]
  • 1
    Да, это немного неожиданно, но я заметил, что в другие моменты время numpy времени играет не так хорошо, как в случае с pandas ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню