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:我以两种方式通过了Try
np.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