如何从日期时间转换为月份常量的工作日?

时间:2018-12-18 13:35:01

标签: python-3.x datetime timedelta relativedelta

我想做的是弄清楚这是一个月的X,然后返回它的相对增量常数(Su Mo Tu...)。我发现了许多跳到每月的特定日期(1)的示例。例如,今天是12月的第三个星期二,我可以这样做:+ relativedelta(month=12, day=1, weekday=TU(3))),但是我想做的却是相反的: 输入今天的日期,然后减去月份的第一天,得到TU(3)之类的值,或者如果它是星期四的第四周,则得到:WE(4)

我的最终目标是能够将该常量传输到另一个月份或timedelta对象,并找到等效的第3个星期二或第4个星期三,等等...

2 个答案:

答案 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