排除周末的两个日期之间的天数
我该怎么计算两个日期之间的天数,但不算周末呢?
23 个回答
31
首先要导入 numpy
,并给它起个别名 np
。函数 np.busday_count
用来计算两个日期之间有效的工作日数量,但不包括结束日期那一天。
如果结束日期早于开始日期,计算的结果会是负数。想了解更多关于 np.busday_count
的信息,可以查看它的文档 这里。
import numpy as np
np.busday_count('2018-04-10', '2018-04-11')
需要注意的是,这个函数可以接受字符串格式的日期,所以在调用这个函数之前,不需要先创建 datetime
对象。
它还支持指定有效的工作日,并可以添加假期选项。
import numpy as np
np.busyday_count('2019-01-21','2020-03-28',weekmask=[1,1,1,1,1,0,0],holidays=['2020-01-01'])
weekmask 的格式是 = [周一, 周二, 周三.....周六, 周日]
67
>>> from datetime import date,timedelta
>>> fromdate = date(2010,1,1)
>>> todate = date(2010,3,31)
>>> daygenerator = (fromdate + timedelta(x + 1) for x in xrange((todate - fromdate).days))
>>> sum(1 for day in daygenerator if day.weekday() < 5)
63
这段代码使用一种叫做生成器表达式的方式来创建一个生成器,这个生成器会生成从fromdate
到todate
之间的所有日期。
接下来,我们可以用这个生成器创建一个列表,并通过weekday()
函数来过滤掉周末,这样列表的大小就代表了我们想要的天数。不过,如果日期之间相隔很久,存储整个列表可能会占用太多内存,所以我们使用另一个生成器表达式,它会过滤掉周末,但每个日期返回1。这样,我们只需要把这些1加起来,就能得到总天数,而不需要存储整个列表。
需要注意的是,如果fromdate
和todate
是同一天,这样计算的结果是0,而不是1。
122
我觉得最简单的办法是用numpy里的一个函数,叫做busday_count
。
import numpy as np
import datetime as dt
start = dt.date( 2014, 1, 1 )
end = dt.date( 2014, 1, 16 )
days = np.busday_count( start, end )