使用python获取当前月份的最后一个星期四

时间:2016-05-02 06:04:20

标签: python datetime python-dateutil

在此answer之后,我试图获取当月最后一个星期四的日期。但是我的代码并没有摆脱循环。

from datetime import datetime
from dateutil.relativedelta import relativedelta, TH

todayte = datetime.today()
cmon = todayte.month

nthu = todayte
while nthu.month == cmon:
    nthu += relativedelta(weekday=TH(1))
    #print nthu.strftime('%d%b%Y').upper()

9 个答案:

答案 0 :(得分:2)

查看relativedelta

的文档
  

请注意,如果计算的日期已经为Monday,则使用(0, 1)(0, -1)将不会更改当天。

如果nthu已经是星期四,那么添加TH(1)TH(-1)将不会产生任何影响,但会产生相同的日期,这就是您的循环无限运行的原因。

我假设一个月内最多5周,并且如下所示:

todayte = datetime.today()
cmon = todayte.month

for i in range(1, 6):
    t = todayte + relativedelta(weekday=TH(i))
    if t.month != cmon:
        # since t is exceeded we need last one  which we can get by subtracting -2 since it is already a Thursday.
        t = t + relativedelta(weekday=TH(-2))
        break

答案 1 :(得分:1)

你应该将2传递给TH而不是1,因为1不会改变任何东西。将您的代码修改为:

while (nthu + relativedelta(weekday=TH(2))).month == cmon:
    nthu += relativedelta(weekday=TH(2))

print nthu.strftime('%d-%b-%Y').upper()
# prints 26-MAY-2016

请注意,我修改了循环的条件,以便在当月的最后一次出现时中断,否则它将在下个月(在本例中为6月)中断。

答案 2 :(得分:1)

from datetime import datetime , timedelta

todayte = datetime.today()
cmon = todayte.month

nthu = todayte
while todayte.month == cmon:
    todayte += timedelta(days=1)
    if todayte.weekday()==3: #this is Thursday 
        nthu = todayte
print nthu

答案 3 :(得分:1)

您也可以使用calendar包。 以monthcalendar的形式访问日历。并注意到,星期五是一周的最后一天。

import calendar
import datetime
now = datetime.datetime.now()
last_sunday = max(week[-1] for week in calendar.monthcalendar(now.year,
                                                              now.month))
print('{}-{}-{:2}'.format(now.year, calendar.month_abbr[now.month],
                              last_sunday))

答案 4 :(得分:0)

我认为这可能是最快的:

end_of_month = datetime.datetime.today() + relativedelta(day=31)
last_thursday = end_of_month + relativedelta(weekday=TH(-1))

答案 5 :(得分:0)

根据亚当·斯密在How can I get the 3rd Friday of a month in Python?上的答案,您可以按如下方式获取当月最后一个星期四的日期:

import calendar
import datetime

def get_thursday(cal,year,month,thursday_number):
    '''
    For example, get_thursday(cal, 2017,8,0) returns (2017,8,3) 
    because the first thursday of August 2017 is 2017-08-03
    '''
    monthcal = cal.monthdatescalendar(year, month)
    selected_thursday = [day for week in monthcal for day in week if \
                    day.weekday() == calendar.THURSDAY and \
                    day.month == month][thursday_number]
    return selected_thursday

def main():
    '''
    Show the use of get_thursday()
    '''
    cal = calendar.Calendar(firstweekday=calendar.MONDAY)
    today = datetime.datetime.today()
    year = today.year
    month = today.month
    date = get_thursday(cal,year,month,-1) # -1 because we want the last Thursday 
    print('date: {0}'.format(date)) # date: 2017-08-31        

if __name__ == "__main__":
    main()

答案 6 :(得分:0)

此代码可以在python 3.x中用于查找当月的上周四。

import datetime
dt = datetime.datetime.today()
def lastThurs(dt):
    currDate, currMth, currYr = dt, dt.month, dt.year
    for i in range(31):
        if currDate.month == currMth and currDate.year == currYr and currDate.weekday() == 3:
            #print('dt:'+ str(currDate))
            lastThuDate = currDate
        currDate += datetime.timedelta(1)

    return lastThuDate

答案 7 :(得分:0)

import datetime
def get_thursday(_month,_year):
    for _i in range(1,32):
        if _i > 9:
            _dateStr = str(_i)
        else:
            _dateStr = '0' + str(_i)
        _date = str(_year) + '-' + str(_month) + '-' + _dateStr
        try:
            a = datetime.datetime.strptime(_date, "%Y-%m-%d").strftime('%a')
        except:
             continue
        if a == 'Thu':
            _lastThurs = _date
    return _lastThurs

x = get_thursday('05','2017')
print(x)

答案 8 :(得分:0)

您可以执行以下操作:

import pandas as pd
from dateutil.relativedelta import relativedelta, TH

expiry_type = 0
today = pd.datetime.today()
expiry_dates = []

if expiry_type == 0:
    # Weekly expiry
    for i in range(1,13):
         expiry_dates.append((today + relativedelta(weekday=TH(i))).date())
else:
    # Monthly expiry
    for i in range(1,13):
        x = (today + relativedelta(weekday=TH(i))).date()
        y = (today + relativedelta(weekday=TH(i+1))).date()
        if x.month != y.month :
            if x.day > y.day :
                expiry_dates.append(x)

print(expiry_dates)