’计算两个日期之间有几个工作日(除周末)、有几天(不除周末)都可以用python里pandas的函数实现。
1. 计算有几个工作日:
(1)bdate_range(start_day, end_day,freq='b')
start_day: 开始日期,日期格式可以兼容多种格式:2020-01-1或20200101或者1/1/2020!!!可以说是很完美了。
end_day:结束日期
freq:频率,bdate_range函数不带该参数时默认是'b',即工作日。计算工作日时,这个freq固定为B或b或者不带这个参数可以
以下是不同格式的实现:
# -*- coding: utf-8 -*-
Created on Thu Mar 19 20:16:03 2020
@author: DELL
def weekday_1():
import pandas as pd
e = pd.bdate_range('20200319', '20200326',freq='b')
#bdate_range 6
#date_range 8
print (e)
minutes = len(e)
print(minutes)
weekday_1()
def weekday_2():
import pandas as pd
e = pd.bdate_range('19/3/2020', '26/03/2020',freq='B')
#bdate_range 6
#date_range 8
print (e)
minutes = len(e)
print(minutes)
weekday_2()
def weekday_3():
import pandas as pd
e = pd.bdate_range('2020-03-19', '2020-03-26')
#bdate_range 6
#date_range 8
print (e)
minutes = len(e)
print(minutes)
weekday_3()
runfile('C:/Users/DELL/Desktop/untitled0.py', wdir='C:/Users/DELL/Desktop')
DatetimeIndex(['2020-03-19', '2020-03-20', '2020-03-23', '2020-03-24',
'2020-03-25', '2020-03-26'],
dtype='datetime64[ns]', freq='B')
DatetimeIndex(['2020-03-19', '2020-03-20', '2020-03-23', '2020-03-24',
'2020-03-25', '2020-03-26'],
dtype='datetime64[ns]', freq='B')
DatetimeIndex(['2020-03-19', '2020-03-20', '2020-03-23', '2020-03-24',
'2020-03-25', '2020-03-26'],
dtype='datetime64[ns]', freq='B')
(2)date_range(start_day, end_day,freq='b')
date_range 默认的freq是'd'就是日期的意思,如果不带参数计算出来就是所有的天数,所有如果要用date_range计算工作日,必须要带freq='b'的参数,其他开始日期和结束日期的格式跟bdate_range一样。
# -*- coding: utf-8 -*-
Created on Thu Mar 19 20:16:03 2020
@author: DELL
def weekday_4():
import pandas as pd
e = pd.date_range('20200319', '20200326',freq='B')
#bdate_range 6
#date_range 8
print (e)
minutes = len(e)
print(minutes)
weekday_4()
runfile('C:/Users/DELL/Desktop/untitled0.py', wdir='C:/Users/DELL/Desktop')
DatetimeIndex(['2020-03-19', '2020-03-20', '2020-03-23', '2020-03-24',
'2020-03-25', '2020-03-26'],
dtype='datetime64[ns]', freq='B')
2. 计算间隔的所有日期数(包含周末):
bdate_range(start_day, end_day,freq='d')
或 date_range(start_day, end_day)
# -*- coding: utf-8 -*-
Created on Thu Mar 19 20:16:03 2020
@author: DELL
def ALLday_1():
import pandas as pd
e = pd.bdate_range('20200319', '20200326',freq='d')
#bdate_range 6
#date_range 8
print (e)
minutes = len(e)
print(minutes)
ALLday_1()
def ALLday_2():
import pandas as pd
e = pd.date_range('19/3/2020', '26/03/2020',freq='d')
#bdate_range 6
#date_range 8
print (e)
minutes = len(e)
print(minutes)
ALLday_2()
def ALLday_3():
import pandas as pd
e = pd.date_range('2020-03-19', '2020-03-26')
#bdate_range 6
#date_range 8
print (e)
minutes = len(e)
print(minutes)
ALLday_3()
运行结果:
runfile('C:/Users/DELL/Desktop/untitled0.py', wdir='C:/Users/DELL/Desktop')
DatetimeIndex(['2020-03-19', '2020-03-20', '2020-03-21', '2020-03-22',
'2020-03-23', '2020-03-24', '2020-03-25', '2020-03-26'],
dtype='datetime64[ns]', freq='D')
DatetimeIndex(['2020-03-19', '2020-03-20', '2020-03-21', '2020-03-22',
'2020-03-23', '2020-03-24', '2020-03-25', '2020-03-26'],
dtype='datetime64[ns]', freq='D')
DatetimeIndex(['2020-03-19', '2020-03-20', '2020-03-21', '2020-03-22',
'2020-03-23', '2020-03-24', '2020-03-25', '2020-03-26'],
dtype='datetime64[ns]', freq='D')
总结:bdate_range和date_range这两个函数都可以计算工作日和所有日期,关键取决于freq参数。
(1)bdate_range 的freq参数默认是b,也就是businesstime工作日;如果要用bdate_range 计算所有日期必须限制freq是d。
(2)date_range的freq参数默认是d,也就是day所有日期;如果要用bdate_range 计算所有日期必须限制freq是b。
b和d都是跟day维度的,所以从3月19号到3月26号,共包含:19、20、21、22、23、24、25、26八天,其中工作日有6天。
3. 利用freq='min'计算所有日期:
bdate_range(start_day, end_day,freq='min')
min是按照分钟维度来计算的,它是从start_day的00:00:00到end_day的00:00:00;其实end_day这一天从00:00:00到23:59:59是没有计算的,所以用freq='min'计算出来是比d计算出来少一天的。
# -*- coding: utf-8 -*-
Created on Thu Mar 19 20:16:03 2020
@author: DELL
def ALLday_4():
import pandas as pd
e = pd.bdate_range('20200319', '20200326',freq='min')
#bdate_range 6
#date_range 8
print (e)
minutes = len(e)
print(minutes//(60*24))
ALLday_4()
运行结果如下:
runfile('C:/Users/DELL/Desktop/untitled0.py', wdir='C:/Users/DELL/Desktop')
DatetimeIndex(['2020-03-19 00:00:00', '2020-03-19 00:01:00',
'2020-03-19 00:02:00', '2020-03-19 00:03:00',
'2020-03-19 00:04:00', '2020-03-19 00:05:00',
'2020-03-19 00:06:00', '2020-03-19 00:07:00',
'2020-03-19 00:08:00', '2020-03-19 00:09:00',
'2020-03-25 23:51:00', '2020-03-25 23:52:00',
'2020-03-25 23:53:00', '2020-03-25 23:54:00',
'2020-03-25 23:55:00', '2020-03-25 23:56:00',
'2020-03-25 23:57:00', '2020-03-25 23:58:00',
'2020-03-25 23:59:00', '2020-03-26 00:00:00'],
dtype='datetime64[ns]', length=10081, freq='T')
分钟/60=小时
小时/24=天数
最后计算出来就是7天。
python计算一段时间内的工作日(除周末、除中国节假日加调休)
’计算两个日期之间有几个工作日(除周末、除假期加调休)可以用python里pandas的函数实现。
1. 计算有两个日期之间有几个工作日:
只需要配置节假日和调休日,放在列表中就ok!
我们以2020年5月为例,实现:计算5.1到5.9号工作日有几天:应该是5.6号、5.7号、5.8号、5.9号四天
start_day = '2020-05-01'
end_day = '2020-05-09'
import pandas as pd
from pandas.tseries.offsets import CustomBusinessDay
def count_businessday(start_day,end_day):
b = CustomBusinessDay(holidays=['2020-04-06','2020-05-01','2020-05-04','2020-05-05','2020-06-25','2020-10-01',
'2020-10-05','2020-10-06','2020-10-07','2020-10-08'])
bus_day = pd.date_range(start=start_day, end=end_day, freq=b)
length = len(bus_day)
extra_work_day = ['2020-04-26','2020-05-09','2020-06-28','2020-09-27','2020-10-10']
extra_len = 0
for i in extra_work_day:
if i>=start_day and i<=end_day:
extra_len = extra_len+1
print(length+extra_len)
if __name__=='__main__':
count_businessday(start_day,end_day)
工作中遇见需要写UDF计算事项办理时间的需求,事项申请和办结由于在线上,可能不在办理时间内,因此要求排除节假日与工作日的非工作时间(午休时间、上班前与下班后的时间),在次做下记录。
一、基本思路
首先需要获取法定节假日,这里参考了另一篇从全年法定节假日时间的文章:
Python获取全年法定节假日时间
文章中已经很详细地叙述了从万年历爬取节假日日期的方法,逻辑也比较简
首先区分一下这里的工作日和节假日是不同的。
工作日是指去掉节假日即周末,但是不去掉调休的日期。
交易日主要针对金融行业,是指去掉节假日和周末,因为周末金融市场也是停盘的,所以即使周末因为调休工作,也不算做交易日。
我们这里主要用到Python中datetime模块。还有一个特别好用的模块就是chinesecalendar,它主要能够实时更新中国的节假日有哪些,简直就是一个利器。
首先安装chine...
计算当天前某个工作日是哪一天,比如想看今天的前面第7个工作日是哪天。
2. pandas.tseries.offsets.BusinessDay
class pandas.tseries.offsets.BusinessDay
Returns a copy of the calling offset object with n=1 and all other attributes equal.
offset
Alias for self._offset.
之前找到一个python的包,可以计算一个自然月内的工作日共几天。
但是不能计算任意时间段内的工作日共有几天,经过查找资料,总算找到了一种方法。
所以便记录下来,有需要的小伙伴可以自行拿去用。
代码如下:
import pandas as pd
from pandas.tseries.offsets import CustomBusinessDay
def count_weekday(s_day, e_day):
holidays_list= CustomBusinessDay(holidays=
Pandas1、获取工作日:bdate_rangeimport pandas as pde = pd.bdate_range('8/7/2019', '8/31/2019')e.date #获取日期列表array([datetime.date(2019, 8, 7), datetime.date(2019, 8, 8),datetime.date(2019, 8, 9), datetime.dat...
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.text.ParseException;
import java.t.