在Python中,如何找到给定周的第一个星期一的日期?

时间:2008-12-29 00:42:57

标签: python datetime

如果我有某个周数(例如51)和某一年(例如2008年),我如何找到同一周的第一个星期一的日期?

非常感谢

6 个答案:

答案 0 :(得分:34)

>>> import time
>>> time.asctime(time.strptime('2008 50 1', '%Y %W %w'))
'Mon Dec 15 00:00:00 2008'

假设您一周的第一天是星期一,如果您一周的第一天是星期日,请使用%U代替%W。有关详细信息,请参阅strptime的文档。

更新:固定周数。 %W指令从0开始,因此第51周将输入为50,而不是51。

答案 1 :(得分:32)

PEZ和Gerald Kaszuba的解决方案工作假设1月1日将始终在给定年份的第一周。对于ISO日历,此假设不正确,请参阅Python's docs以供参考。例如,在ISO日历中,2010年第1周实际上从1月4日开始,2010年1月1日是在2009年第53周。与ISO日历兼容的解决方案:

from datetime import date, timedelta

def week_start_date(year, week):
    d = date(year, 1, 1)    
    delta_days = d.isoweekday() - 1
    delta_weeks = week
    if year == d.isocalendar()[0]:
        delta_weeks -= 1
    delta = timedelta(days=-delta_days, weeks=delta_weeks)
    return d + delta

答案 2 :(得分:15)

from datetime import date, timedelta

def first_monday(year, week):
    d = date(year, 1, 4)  # The Jan 4th must be in week 1  according to ISO
    return d + timedelta(weeks=(week-1), days=-d.weekday())

答案 3 :(得分:8)

这似乎有效,假设第一周可以在去年的某一天有一个星期一下降。

from datetime import date, timedelta

def get_first_dow(year, week):
    d = date(year, 1, 1)
    d = d - timedelta(d.weekday())
    dlt = timedelta(days = (week - 1) * 7)
    return d + dlt

答案 4 :(得分:4)

我略微修改了Vaidas K.的脚本,它将返回本周的开头和一周的结束日。

from datetime import datetime, date, timedelta

def weekbegend(year, week):
    """
    Calcul du premier et du dernier jour de la semaine ISO
    """
    d = date(year, 1, 1)    
    delta_days = d.isoweekday() - 1
    delta_weeks = week
    if year == d.isocalendar()[0]:
        delta_weeks -= 1
    # delta for the beginning of the week
    delta = timedelta(days=-delta_days, weeks=delta_weeks)
    weekbeg = d + delta
    # delta2 for the end of the week
    delta2 = timedelta(days=6-delta_days, weeks=delta_weeks)
    weekend = d + delta2
    return weekbeg, weekend

Soyou可以这样使用它。

weekbeg, weekend = weekbegend(2009, 1)
begweek = weekbeg.strftime("%A %d %B %Y")
endweek = weekend.strftime("%A %d %B %Y")

答案 5 :(得分:0)

使用时间模块中的字符串格式。 Detailed explanation of the formats used

>>> import time
>>> time.strptime("51 08 1","%U %y %w")
(2008, 12, 22, 0, 0, 0, 0, 357, -1)

根据我计算机上的日历,返回的日期会被关闭一周,也许这是因为周数从0开始被索引?