2014-11-21 61 views
0

在给定年份,月份和星期编号(第1,第2,第3等)的情况下,有没有办法查找特定周内的日期范围?我已经看到很多关于如何查找基于特定日期的星期数的答案,但我正在尝试根据星期数找到日期。举例来说,(2013,9,“星期四”,“第3”)给出了结果(2013,9,19)。根据python的月份查找日期

这里是我到目前为止的代码(仅适用于在“teenth”结束日期):

from datetime import date 

def meetupday(year, month, weekday, word): 
    weekday_dic = {"Monday": 0, "Tuesday": 1, "Wednesday": 2, "Thursday": 3, 
       "Friday": 4, "Saturday": 5, "Sunday": 6} 
    week_of_the_month = {"1st": 1, "2nd": 2, "3rd": 3, "4th": 4, "last": 5} 
    if word == "teenth": 
     for day in xrange(13, 20): 
     if weekday_dic[weekday] == date(year, month, day).weekday(): 
      return year, month, day 
    else: 
    for date in xrange(1, amount_of_days+1): 
     date_data = datetime.date(year, month, date).isocalendar() 
     if date_data[2] == weekday_dic[weekday]+1: 
      return year, month, week_of_the_month[word] 

这是exercism.io的聚会问题。

回答

1

我的解决方案基于您给定的数据的日期将是类似的东西

from datetime import datetime, timedelta  
weekday_dic = {"Monday": 0, "Tuesday": 1, "Wednesday": 2, "Thursday": 3, 
        "Friday": 4, "Saturday": 5, "Sunday": 6} 
week_of_the_month = {"1st": 1, "2nd": 2, "3rd": 3, "4th": 4, "last": 5} 

start_first_week = first_sunday = datetime(year, month, 1) 
while start_first_week.weekday() != weekday_dic[weekday]: 
    start_first_week += timedelta(days=1) 

start_first_week += timedelta(days=(week_of_the_month[word] - 1) * 7) 

我希望帮助你一点

+0

哇,与我的相比,这太神奇了!非常感谢! – Drivebyluna 2014-11-23 04:03:35

1

一个快速的问题,我发现了达达主义的解决方案是,当我试图计算每年美国阵亡将士纪念日的日期(5月的最后一个星期一)。我会得到2018-06-04。根据我的参数,这不是正确的月份。如果输出月份与输入不匹配,我添加了一个快速修复,只需要减去7天。我不确定底层问题是什么。现在返回正确答案:2018-05-28。

from datetime import datetime, timedelta  
weekday_dic = {"Monday": 0, "Tuesday": 1, "Wednesday": 2, "Thursday": 3, 
         "Friday": 4, "Saturday": 5, "Sunday": 6} 
week_of_the_month = {"1st": 1, "2nd": 2, "3rd": 3, "4th": 4, "last": 5} 

start_first_week = first_sunday = datetime(year, month, 1) 
while start_first_week.weekday() != weekday_dic[weekday]: 
    start_first_week += timedelta(days=1) 

start_first_week += timedelta(days=(week_of_the_month[word] - 1) * 7) 
if start_first_week.month != month: 
    start_first_week += datetime.delta(days=-7) 
相关问题