Python 在数据框的日期列上使用numpy is_busday函数
我将Excel文件加载到一个数据框中,Excel文件上有日期列。 加载后,我将date列转换为datetime64[ns]Python 在数据框的日期列上使用numpy is_busday函数,python,pandas,numpy,Python,Pandas,Numpy,我将Excel文件加载到一个数据框中,Excel文件上有日期列。 加载后,我将date列转换为datetime64[ns] df['Date'] = pd.to_datetime(df['Date']) 我在Dataframe上创建了一个名为“Is_Business_Day”的新列 在本专栏中,我从Numpy应用了is_busday,以查看日期是工作日还是周末 我尝试了两种代码,但都不起作用 df['Is_Business_Day']= [np.is_busday(np.datetime64(
df['Date'] = pd.to_datetime(df['Date'])
我在Dataframe上创建了一个名为“Is_Business_Day”的新列
在本专栏中,我从Numpy应用了is_busday,以查看日期是工作日还是周末
我尝试了两种代码,但都不起作用
df['Is_Business_Day']= [np.is_busday(np.datetime64(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'
TypeError:无法从dtype强制转换迭代器操作数0 dtype('方法1:
将df['Date']
转换为字符串,然后将其发送给np.is\u 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)
示例:
你可以做:
方法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
>>> 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
方法2:
>>> 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
>>> 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
将day转换为字符串可以实现numpy。我想知道为什么numpy函数不能与pandas datetime类型一起工作。我打印了数据帧的数据类型,它显示日期类型是正确的datetime64[ns]是的,这有点出乎意料,但我注意到其他一些时候,numpy
datetimes在pandas
datetimes上的表现不如它们应该的好。。。