如何将日期时间转换为当月的工作日常量



我想做的是计算出这个月的X是多少,并返回它的相对delta常数(Su Mo Tu...(。我发现了许多跳到一个月中某一天的例子(1(。例如,今天是12月的第三个星期二,我可以这样做:+ relativedelta(month=12, day=1, weekday=TU(3))),但我想做的恰恰相反:输入今天的日期,减去月初,得到类似TU(3)的东西,或者如果是第四个星期三,得到:WE(4)

我的最终目标是能够将这个常数转移到不同的月份或时间增量对象,并找到等效的第三个星期二或第四个星期三,等等…

这是我提出的一个解决方案,也许你会发现它不那么复杂。

它似乎也快了大约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日是本月的第三个星期二。

好的,我找到了一种方法,使用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

最新更新