给定一个工作日名称的字符串,如何将工作日计算为十进制(以及它出现的下一个日期)?

Ale*_*lex 5 python optimization datetime

给定一个字符串,reqDayOf这是一个工作日名称,你如何计算工作日为十进制(然后根据一个datetime对象返回它的下一个实例)?

获取datetime对象的年份和iso年份,然后使用strptime年份+一周+工作日名称,但感觉就像一个黑客.

import datetime

def getDateFromDayOf(dateTimeObj,reqDayOf):
  #reqDayOf is one of ['monday','tuesday','wednesday','thursday','friday','saturday','sunday']
  #return the next instance of reqDayOf
  #after dateTimeObj
  #as a datetime object 
  #Get the WeekOfYear from dateTimeObj and then
  #get the date based on Year + WeekOfYear + reqDayOf 
  (dtoYear,dtoIsoWeek,x)=dateTimeObj.isocalendar()
  checkDate= '{}-{}-{}'.format( dtoYear,dtoIsoWeek,reqDayOf)
  dateOfDay=datetime.datetime.strptime(checkDate,"%Y-%U-%A")
  #return dateOfDay if it's greater than the original date
  if dateOfDay > dateTimeObj:
    return dateOfDay
  else:
    #this is needed on Sundays
    #add a week
    return dateOfDay + datetime.timedelta(days=7)  


>>> datetime.datetime.now().strftime('%a %Y %b %d')
'Fri 2013 Apr 05'
>>> getDateFromDayOf(datetime.datetime.now(),'Monday').strftime('%a %Y %b %d')
'Mon 2013 Apr 08'
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 5

工作日方法返回星期几(作为整数):

import datetime as DT
dow = dict(zip('monday tuesday wednesday thursday friday saturday sunday'.split(),
           range(7)))

def getDateFromDayOf(dateTimeObj, reqDayOf):
    weekday = dateTimeObj.weekday()        
    return dateTimeObj + DT.timedelta(days=(dow[reqDayOf.lower()]-weekday-1)%7+1)
Run Code Online (Sandbox Code Playgroud)
In [90]: getDateFromDayOf(DT.datetime.now(), 'Monday').date()
Out[90]: datetime.date(2013, 4, 8)

In [91]: getDateFromDayOf(DT.datetime.now(), 'Tuesday').date()
Out[91]: datetime.date(2013, 4, 9)

In [92]: getDateFromDayOf(DT.datetime.now(), 'Friday').date()
Out[92]: datetime.date(2013, 4, 12)
Run Code Online (Sandbox Code Playgroud)

或者,使用dateutil,

import datetime as DT
import dateutil
import dateutil.relativedelta as rdelta
import dateutil.rrule as rrule

dow = dict(zip('monday tuesday wednesday thursday friday saturday sunday'.split(),
               (getattr(rdelta, d) for d in 'MO TU WE TH FR SA SU'.split())))
def getDateFromDayOf(dateTimeObj, reqDayOf):
    rr = rrule.rrule(
        rrule.DAILY,                       # step by days
        byweekday = dow[reqDayOf.lower()], # return only this day of the week
        dtstart = dateTimeObj)             # start on this day 
    res = rr.after(dateTimeObj, inc=False) # inc=False means don't include the dtstart day
    return res
Run Code Online (Sandbox Code Playgroud)

使用dateutil,您可以以高级方式表达想法,而不必担心像肮脏的细节中的逐个错误

DT.timedelta(days=(dow[reqDayOf.lower()]-weekday-1)%7+1)
Run Code Online (Sandbox Code Playgroud)