Я загружаю файл 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'
Пытался искать решение, но ничего не мог найти. Может ли кто-нибудь дать мне несколько советов? Благодарю.
Преобразуйте df['Date']
в строку перед тем, как np.is_busday
ее np.is_busday
:
df['Is_Business_Day'] = [np.is_busday(x) for x in df['Date'].astype(str)]
Вы можете просто использовать 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
numpy
времени играет не так хорошо, как в случае сpandas
...