Python 在数据框的日期列上使用numpy is_busday函数

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(

我将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(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上的表现不如它们应该的好。。。