- 计算最后一个周五的日期
- 问题:
- 需要查找星期中某一天出现的日期,比如星期五。
- 解决方案:
- Python 的datetime 模块中有工具函数和类可以执行这样的计算,下面是一个通用的解决 方案:
from datetime import datetime, timedelta
weekdays = ["Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday"]
def get_previous_byday(dayname, start_date= None):
if start_date is None:
start_date = datetime.today()
day_num = start_date.weekday()
day_num_target = weekdays.index(dayname)
days_age = (7 + day_num - day_num_target)%7
if days_age == 0:
days_age =7
target_date = start_date - timedelta(days= days_age)
return target_date
datetime.today() # 2018-11-24 21:28:30.601299
get_previous_byday("Monday") # 2018-11-19 21:29:20.514153
- 可选的 start_date 参数可以由另外一个 datetime 实例来提供,比如:
get_previous_byday("Friday", datetime(2018, 11, 24))
# 2018-11-23 00:00:00
-
讨论: 上面的算法原理是这样的:先将开始日期和目标日期映射到星期 list 的位置上。然 后通过模运算计算出目标日期要经过多少天能到达开始日期。然后用开始日期捡取那个时间差 就能得到结果日期。
-
如果需要执行大量的日期计算的话,可以安装第三方包 python-dateutil 来代替。比如, 下面是使用 dateutil 模块中的 relativedelta() 函数执行同样的计算:
from dateutil.relativedelta import relativedelta
from dateutil.rrule import *
d = datetime.now()
print(d) # 2018-11-24 21:45:48.590668
print(d + relativedelta(weekday=FR)) # 下星期五
# 2018-11-30 21:46:36.555411
print(d + relativedelta(weekday= FR(-1))) # 这个星期的星期五
# 2018-11-23 21:47:50.619647