计算使用熊猫列之间的工作日

时间:2018-09-18 13:44:14

标签: python pandas numpy

我试图计算两个日期(存储在数据框的单独列中)之间的工作日数。

    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)

  1. 传递数组np.busday_count(dt1,dt2)

注意2:我的数据框有超过15万行,因此我需要使用高效的算法

4 个答案:

答案 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还有其他一些可选参数,例如工作日,假期...,您可以根据需要使用。我希望这会有所帮助。