【发布时间】:2012-08-16 17:25:36
【问题描述】:
在 Python 中,给定一个日期,我如何找到前一个工作日? (平日是周一到周五。我不在乎假期)
【问题讨论】:
在 Python 中,给定一个日期,我如何找到前一个工作日? (平日是周一到周五。我不在乎假期)
【问题讨论】:
参见datetime 模块,尤其是date() 和weekday() 函数。例如:
import datetime
temp = datetime.date(2012,8,21) # Today's date: 2012/08/21
print temp.weekday()
这将输出1。 0 代表星期一,1 代表星期二,以此类推,直到 6 代表星期日。从这里很容易找到前一个工作日。
【讨论】:
只需从给定日期中减去一天,然后检查该日期是否为工作日。如果没有,则减去另一个,直到你有一个工作日:
from datetime import date, timedelta
def prev_weekday(adate):
adate -= timedelta(days=1)
while adate.weekday() > 4: # Mon-Fri are 0-4
adate -= timedelta(days=1)
return adate
演示:
>>> prev_weekday(date.today())
datetime.date(2012, 8, 20)
>>> prev_weekday(date(2012, 8, 20))
datetime.date(2012, 8, 17)
或者,使用偏移表;不需要把它变成一个映射,一个元组就可以了:
_offsets = (3, 1, 1, 1, 1, 1, 2)
def prev_weekday(adate):
return adate - timedelta(days=_offsets[adate.weekday()])
【讨论】:
return adate - timedelta(days=[3, 1, 1, 1, 1, 1, 2][adate.weekday()])
在日期时间模块中,您可以执行以下操作:a = date.today() - timedelta(days=1)
然后a.weekday()。其中星期一是 0,星期日是 6。
【讨论】:
这是一个老问题,但无论如何,这是一种更简单的方法,不需要循环
from datetime import datetime, timedelta
today = datetime.today() # Today date
weekday = 6
days = today.isoweekday() - weekday
if days<0:
days += 7
previous_date = today - timedelta(days=days)
print(previous_date)
【讨论】: