1

我想要做的是找出这个月的 X 是什么,并返回它的相对增量常数 ( Su Mo Tu...)。我发现了许多跳转到一个月中特定日期的示例 ( 1 )。例如,今天是 12 月的第 3 个星期二,我可以这样做:+ relativedelta(month=12, day=1, weekday=TU(3)))但我想做的是相反的:输入今天的日期并减去本月的第一天,得到类似的东西,TU(3)或者如果它是第 4 天周三获得:WE(4)

我的最终目标是能够将此常量转移到不同的月份或 timedelta 对象并找到等效的第 3 个星期二或第 4 个星期三等...

4

2 回答 2

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 日是本月的第三个星期二。

于 2018-12-18T15:16:39.380 回答
1

好的,我找到了一种方法,使用 rrule 创建一个月中的天列表,直到今天共享当前工作日,然后该列表的长度变为第 N 个。比我使用列表作为工作日常量的查找表。未经测试以查看这是否适用于本月的每一天,但这是一个开始。

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
于 2018-12-18T13:35:00.837 回答