3.13 計算最后一個周五的日期

2018-02-24 15:26 更新

問題

你需要查找星期中某一天最后出現(xiàn)的日期,比如星期五。

解決方案

Python的datetime模塊中有工具函數(shù)和類可以幫助你執(zhí)行這樣的計算。下面是對類似這樣的問題的一個通用解決方案:

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
Topic: 最后的周五
Desc :
"""
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_ago = (7 + day_num - day_num_target) % 7
    if days_ago == 0:
        days_ago = 7
    target_date = start_date - timedelta(days=days_ago)
    return target_date

在交互式解釋器中使用如下:

>>> datetime.today() # For reference
datetime.datetime(2012, 8, 28, 22, 4, 30, 263076)
>>> get_previous_byday('Monday')
datetime.datetime(2012, 8, 27, 22, 3, 57, 29045)
>>> get_previous_byday('Tuesday') # Previous week, not today
datetime.datetime(2012, 8, 21, 22, 4, 12, 629771)
>>> get_previous_byday('Friday')
datetime.datetime(2012, 8, 24, 22, 5, 9, 911393)
>>>

可選的start_date參數(shù)可以由另外一個datetime實例來提供。比如:

>>> get_previous_byday('Sunday', datetime(2012, 12, 21))
datetime.datetime(2012, 12, 16, 0, 0)
>>>

討論

上面的算法原理是這樣的:先將開始日期和目標(biāo)日期映射到星期數(shù)組的位置上(星期一索引為0),然后通過模運算計算出目標(biāo)日期要經(jīng)過多少天才能到達(dá)開始日期。然后用開始日期減去那個時間差即得到結(jié)果日期。

如果你要像這樣執(zhí)行大量的日期計算的話,你最好安裝第三方包python-dateutil來代替。比如,下面是是使用dateutil模塊中的 relativedelta() 函數(shù)執(zhí)行同樣的計算:

>>> from datetime import datetime
>>> from dateutil.relativedelta import relativedelta
>>> from dateutil.rrule import *
>>> d = datetime.now()
>>> print(d)
2012-12-23 16:31:52.718111

>>> # Next Friday
>>> print(d + relativedelta(weekday=FR))
2012-12-28 16:31:52.718111
>>>

>>> # Last Friday
>>> print(d + relativedelta(weekday=FR(-1)))
2012-12-21 16:31:52.718111
>>>
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號