我试图计算两个日期(存储在数据框的单独列中)之间的工作日数。
MonthBegin MonthEnd
0 2014-06-09 2014-06-30
1 2014-07-01 2014-07-31
2 2014-08-01 2014-08-31
3 2014-09-01 2014-09-30
4 2014-10-01 2014-10-31
我尝试申请numpy.busday_count
,但出现以下错误:
Iterator operand 0 dtype could not be cast from dtype('<M8[ns]') to dtype('<M8[D]') according to the rule 'safe'
我尝试将类型更改为时间戳,如下所示:
Timestamp('2014-08-31 00:00:00')
或日期时间:
datetime.date(2014, 8, 31)
或numpy.datetime64:
numpy.datetime64('2014-06-30T00:00:00.000000000')
有人知道如何解决吗?
注1:我以两种方式通过了np.busday_count
的尝试:
1.传递数据框列,t['Days']=np.busday_count(t.MonthBegin,t.MonthEnd)
np.busday_count(dt1,dt2)
注意2:我的数据框有超过15万行,因此我需要使用高效的算法
答案 0 :(得分:1)
您可以使用(costo_factura_pivote * cantidad_factura_pivote)
,我也纠正了您的输入,因为MonthEnd的大部分时间都早于MonthBegin
bdate_range
答案 1 :(得分:0)
您需要提供用于编写日期的模板。
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),将其转换为天数,只需使用
答案 2 :(得分:0)
我认为最好的方法是
df.apply(lambda row : np.busday_count(row['MBegin'],row['MEnd']),axis=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
答案 3 :(得分:0)
您可以修改代码以得到所需的结果,如下所示:
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_count
还有其他一些可选参数,例如工作日,假期...,您可以根据需要使用。我希望这会有所帮助。