计算给定日期的整周数
Calculate no of whole weeks for a given dates
from datetime import datetime
def calculate_whole_week(year, start_month, end_month, weekday):
date_str_start = str(year)+' ' + start_month+' '+ weekday
date_str_end = str(year)+' ' + end_month+' '+ weekday
start_day = datetime.strptime(date_str_start, '%Y %B %A')
end_day = datetime.strptime(date_str_end, '%Y %B %A')
no_of_whole_weeks = (end_day - start_day).days//7 -1
return no_of_whole_weeks
calculate_whole_week(2014,'April','May','Wednesday')
我尝试了以下但无法编译它
start_week_day = time.strptime(str(Y)+' '+ A + ' '+ W,"%Y %B %A").tm_wday
end_week_day = time.strptime(str(Y)+' '+ B + ' '+ W,"%Y %B %A").tm_wday
start_dt = time.strptime(str(Y)+' '+A+' '+ str(start_week_day),'%Y %B %d')
end_dt = time.strptime(str(Y)+' '+ B +' '+ str(end_week_day),'%Y %B %d')
no_of_whole_weeks = (end_dt - start_dt).days//7 -1
print (end_dt - start_dt).days
return no_of_whole_weeks
我在这里面临的挑战是如何计算我经过的工作日的确切日期
如果我 运行 上面的代码我得到 3 而不是 7
你为什么不把问题分解成更小的部分,然后分别解决每个问题?例如:
给定两个 date
或 datetime
对象,确定它们之间的整周数:
def whole_weeks(start, end):
"""Number of whole weeks between start and end dates."""
weeks = 0
while start <= end:
start += datetime.timedelta(weeks=1)
weeks += 1
return weeks - 1
给定年份、月份名称和星期名称,计算与其匹配的第一个日期:
def first_matching_date(year, month_name, weekday_name):
"""The first date a weekday occurred in a given month and year."""
day = datetime.datetime.strptime(str(year) + month_name, '%Y%B')
for _ in range(7):
if day.strftime('%A') == weekday_name:
return day
day += datetime.timedelta(days=1)
raise ValueError('no matching date for {!r}'.format(weekday_name))
因此,给定一年、两个月和一个工作日,求每个月中该工作日第一次出现之间的整周数:
def calculate_whole_week(year, start_month, end_month, weekday_name):
"""Whole weeks between the weekday in specified start and end month."""
return whole_weeks(
first_matching_date(year, start_month, weekday_name),
first_matching_date(year, end_month, weekday_name),
)
这使得开发和测试每个步骤变得更加容易,导致代码更具可读性,并给了我:
>>> calculate_whole_week(2014, 'April', 'May', 'Wednesday')
5
这确实是2014年4月的第一个星期三(2014/4/2)和2014年5月的第一个星期三(2014/5/7)之间的整周数;我不确定您为什么期望 7
。我可能误解了具体问题,但希望你能把分解它的过程应用到你的实际任务中。
from datetime import datetime
def calculate_whole_week(year, start_month, end_month, weekday):
date_str_start = str(year)+' ' + start_month+' '+ weekday
date_str_end = str(year)+' ' + end_month+' '+ weekday
start_day = datetime.strptime(date_str_start, '%Y %B %A')
end_day = datetime.strptime(date_str_end, '%Y %B %A')
no_of_whole_weeks = (end_day - start_day).days//7 -1
return no_of_whole_weeks
calculate_whole_week(2014,'April','May','Wednesday')
我尝试了以下但无法编译它
start_week_day = time.strptime(str(Y)+' '+ A + ' '+ W,"%Y %B %A").tm_wday
end_week_day = time.strptime(str(Y)+' '+ B + ' '+ W,"%Y %B %A").tm_wday
start_dt = time.strptime(str(Y)+' '+A+' '+ str(start_week_day),'%Y %B %d')
end_dt = time.strptime(str(Y)+' '+ B +' '+ str(end_week_day),'%Y %B %d')
no_of_whole_weeks = (end_dt - start_dt).days//7 -1
print (end_dt - start_dt).days
return no_of_whole_weeks
我在这里面临的挑战是如何计算我经过的工作日的确切日期
如果我 运行 上面的代码我得到 3 而不是 7
你为什么不把问题分解成更小的部分,然后分别解决每个问题?例如:
给定两个
date
或datetime
对象,确定它们之间的整周数:def whole_weeks(start, end): """Number of whole weeks between start and end dates.""" weeks = 0 while start <= end: start += datetime.timedelta(weeks=1) weeks += 1 return weeks - 1
给定年份、月份名称和星期名称,计算与其匹配的第一个日期:
def first_matching_date(year, month_name, weekday_name): """The first date a weekday occurred in a given month and year.""" day = datetime.datetime.strptime(str(year) + month_name, '%Y%B') for _ in range(7): if day.strftime('%A') == weekday_name: return day day += datetime.timedelta(days=1) raise ValueError('no matching date for {!r}'.format(weekday_name))
因此,给定一年、两个月和一个工作日,求每个月中该工作日第一次出现之间的整周数:
def calculate_whole_week(year, start_month, end_month, weekday_name): """Whole weeks between the weekday in specified start and end month.""" return whole_weeks( first_matching_date(year, start_month, weekday_name), first_matching_date(year, end_month, weekday_name), )
这使得开发和测试每个步骤变得更加容易,导致代码更具可读性,并给了我:
>>> calculate_whole_week(2014, 'April', 'May', 'Wednesday')
5
这确实是2014年4月的第一个星期三(2014/4/2)和2014年5月的第一个星期三(2014/5/7)之间的整周数;我不确定您为什么期望 7
。我可能误解了具体问题,但希望你能把分解它的过程应用到你的实际任务中。