我想做的是弄清楚这是一个月的X,然后返回它的相对增量常数(Su Mo Tu...
)。我发现了许多跳到每月的特定日期(1)的示例。例如,今天是12月的第三个星期二,我可以这样做:+ relativedelta(month=12, day=1, weekday=TU(3)))
,但是我想做的却是相反的:
输入今天的日期,然后减去月份的第一天,得到TU(3)
之类的值,或者如果它是星期四的第四周,则得到:WE(4)
我的最终目标是能够将该常量传输到另一个月份或timedelta对象,并找到等效的第3个星期二或第4个星期三,等等...
答案 0 :(得分:2)
这是我提出的解决方案,也许您会发现它不那么复杂。
它似乎也快了大约4倍,如果您处理很多日期,这可能会有所作为。
from datetime import *
from dateutil.relativedelta import *
def weekDayOfTheMonth(xdate):
daylist = [MO,TU,WE,TH,FR,SA,SU]
weekday = xdate.weekday()
firstDayOfTheMonth = datetime(xdate.year, xdate.month, 1)
interval = (weekday + 7 - firstDayOfTheMonth.weekday() ) % 7
firstOfThisWeekDay = datetime(xdate.year, xdate.month, 1 + interval)
n = ((xdate.day - firstOfThisWeekDay.day) / 7) + 1
return daylist[weekday](n)
print(weekDayOfTheMonth(datetime.today()))
print(weekDayOfTheMonth(datetime(2018,11,24)))
基本上会发生什么:
我发现星期几是给定月份的第一天。
根据这些信息,我可以轻松计算给定月份中任何给定工作日的第一天。
然后,我可以更轻松地计算出例如2018年12月18日是本月的第三个星期二。
答案 1 :(得分:1)
好吧,我找到了一种使用rrule来创建一个月列表的方法,该列表共享直到今天的当前工作日,然后此列表的长度变为Nth。比起将清单用作工作日常量的查找表而言。未经测试,看看是否可以在每月的每一天使用,但这只是一个开始。
from datetime import *; from dateutil.relativedelta import *
from dateutil.rrule import rrule, WEEKLY
import calendar
def dayofthemonth(xdate):
daylist = [MO,TU,WE,TH,FR,SA,SU]
thisweekday = daylist[xdate.weekday()]
thisdaylist = list(rrule(freq=WEEKLY, dtstart=xdate+relativedelta(day=1), until=xdate, byweekday=xdate.weekday()))
return thisweekday(len(thisdaylist))
print(dayofthemonth(datetime.today())) #correctly returns TU(+3) for 2018, 12, 18