Python 计算两列之间的工作日
我试图计算两个日期之间的工作日数(存储在数据框中的不同列中) 我已尝试应用Python 计算两列之间的工作日,python,pandas,numpy,Python,Pandas,Numpy,我试图计算两个日期之间的工作日数(存储在数据框中的不同列中) 我已尝试应用numpy.busday\u count,但出现以下错误: Iterator operand 0 dtype could not be cast from dtype('<M8[ns]') to dtype('<M8[D]') according to the rule 'safe' 或日期时间: datetime.date(2014, 8, 31) 或转到numpy.datetime64: numpy.d
numpy.busday\u count
,但出现以下错误:
Iterator operand 0 dtype could not be cast from dtype('<M8[ns]') to dtype('<M8[D]') according to the rule 'safe'
或日期时间:
datetime.date(2014, 8, 31)
或转到numpy.datetime64:
numpy.datetime64('2014-06-30T00:00:00.000000000')
有人知道怎么修吗
注1:我以两种方式通过了Trynp.busday\u计数:
1.传递数据帧列,t['Days']=np.busday\u计数(t.MonthBegin,t.MonthEnd)
传递数组np.busday\u计数(dt1、dt2)
注2:我的数据帧有超过150K行,因此我需要使用有效的算法。您可以使用bdate\u range
,我还更正了您的输入,因为MonthEnd的大部分时间早于MonthBegin
[len(pd.bdate_range(x,y))for x,y in zip(df['MonthBegin'],df['MonthEnd'])]
Out[519]: [16, 21, 22, 23, 20]
您需要提供写入日期的模板
a = datetime.strptime('2014-06-9', '%Y-%m-%d')
计算一下你的
b = datetime.strptime('2014-06-30', '%Y-%m-%d')
现在他们的区别
c = b-a
c.days
这给了你21天的时间差,你现在可以使用列表理解来获得两个日期之间的时间差。
将为您提供datetime.timedelta(21),要将其转换为天,只需使用我认为最好的方法是
df.apply(lambda行:np.busday\u计数(行['MBegin',行['MEnd')),轴=1)
对于我的数据帧df
,如下所示:
MBegin MEnd
0 2011-01-01 2011-02-01
1 2011-01-10 2011-02-10
2 2011-01-02 2011-02-02
做:
df['MBegin'] = df['MBegin'].values.astype('datetime64[D]')
df['MEnd'] = df['MEnd'].values.astype('datetime64[D]')
df['busday'] = df.apply(lambda row : np.busday_count(row['MBegin'],row['MEnd']),axis=1)
>>df
MBegin MEnd busday
0 2011-01-01 2011-02-01 21
1 2011-01-10 2011-02-10 23
2 2011-01-02 2011-02-02 22
您可以修改代码以获得所需的结果,如下所示:
df = pd.DataFrame({'MonthBegin': ['2014-06-09', '2014-08-01', '2014-09-01', '2014-10-01', '2014-11-01'],
'MonthEnd': ['2014-06-30', '2014-08-31', '2014-09-30', '2014-10-31', '2014-11-30']})
df['MonthBegin'] = df['MonthBegin'].astype('datetime64[ns]')
df['MonthEnd'] = df['MonthEnd'].astype('datetime64[ns]')
df['BDays'] = np.busday_count(df['MonthBegin'].tolist(), df['MonthEnd'].tolist())
print(df)
MonthBegin MonthEnd BDays
0 2014-06-09 2014-06-30 15
1 2014-08-01 2014-08-31 21
2 2014-09-01 2014-09-30 21
3 2014-10-01 2014-10-31 22
4 2014-11-01 2014-11-30 20
此外,numpy.busday\u count
还有一些其他可选参数,如weekmask、holidays。。。您可以根据需要使用。您能展示一下您是如何使用的吗np.busday\u count
?可能重复我已经编辑了这个问题。因为我的数据框有超过150K行,您是否有更快的算法,这个算法真的是时间问题consuming@JeffTehranidf.values.astype中x的np.busday\u计数(x[0],x[1])('datetime64[D]')]
检查此项:df[“MonthBegin”]=df[“MonthBegin”].values.astype('datetime64[D]'))
可能会解决您的问题。谢谢,它可以工作,而且比任何其他算法都要快得多。
df['MBegin'] = df['MBegin'].values.astype('datetime64[D]')
df['MEnd'] = df['MEnd'].values.astype('datetime64[D]')
df['busday'] = df.apply(lambda row : np.busday_count(row['MBegin'],row['MEnd']),axis=1)
>>df
MBegin MEnd busday
0 2011-01-01 2011-02-01 21
1 2011-01-10 2011-02-10 23
2 2011-01-02 2011-02-02 22
df = pd.DataFrame({'MonthBegin': ['2014-06-09', '2014-08-01', '2014-09-01', '2014-10-01', '2014-11-01'],
'MonthEnd': ['2014-06-30', '2014-08-31', '2014-09-30', '2014-10-31', '2014-11-30']})
df['MonthBegin'] = df['MonthBegin'].astype('datetime64[ns]')
df['MonthEnd'] = df['MonthEnd'].astype('datetime64[ns]')
df['BDays'] = np.busday_count(df['MonthBegin'].tolist(), df['MonthEnd'].tolist())
print(df)
MonthBegin MonthEnd BDays
0 2014-06-09 2014-06-30 15
1 2014-08-01 2014-08-31 21
2 2014-09-01 2014-09-30 21
3 2014-10-01 2014-10-31 22
4 2014-11-01 2014-11-30 20