找到一周中的星期几,星期六结束,第一周包含至少4天,在python中

时间:2013-05-27 00:54:03

标签: python datetime week-number weekday

对于给定日期,我必须按照以下规则查找一年中的周数:

  1. 周从星期日开始,到星期六结束。
  2. 一年的第一个星期在1月的第一个星期六结束,只要它在月中至少下降四天,即使这意味着第一个星期在12月开始。
  3. 我知道datetime.datetime.isocalendar()会返回类似的结果,但周一开始。 time.strftime('%U',<tuple>)模块返回周日开始的周数,但是它将一年中的第一周视为在第一个星期六结束的一周(不考虑一周中最少4天的一周) 。是否有一个模块可以让我根据上面的定义找到周数?否则有人可能会建议重载datetime.isocalendar()

    的方法

    编辑:我正在尝试以下方法

    步骤1:查找一年中的第一周,计算周日周数,而不考虑4天限制(基本上第一周应包含一年中的第一周)。

    我用过

    dt = datetime.date.today()
    year = dt.year 
    first_Sunday = datetime.datetime.strptime('%d-00-0' % year, '%Y-%U-%w').date()
    

    步骤2:确定获得的第一周是否包含第一个星期三。

    然而,由于一些奇怪的原因,datetime.datetime.strptime('2013-00-0', '%Y-%U-%w').date()正在输出date(2013, 1, 1),这显然是星期二!!

2 个答案:

答案 0 :(得分:1)

由于你知道大致什么时候会崩溃,找到第一周的最简单方法可能是对它进行线性搜索。按照你给出的规则,本周末将在1月4日或之后的第一个星期六。你可以通过以下方式找到:

def first_saturday(year):
     candidate = dt.datetime(year, 1, 4)
     day = dt.timedelta(days=1)
     while candidate.weekday() != 6:
         candidate += day
     return candidate

如果你愿意,你可以通过实施datecount分析itertools.count功能来使这个读取更好一点,这样你就有了:

first_saturday = next(day for day in 
   datecount(datetime(year, 1, 4), timedelta(days=1)) 
   if day.weekday() == 6)

从那里开始,从星期六开始减去6天,找到星期日。那么周数应该是:

(arbitrary_day - first_sunday) // timedelta(days=7)

这将从零开始计算。

要了解特定日期属于哪一年,只有三种可能性:格里高历,年后或前一年。您感兴趣的是first_sunday(year) <= arbitrary_date中那三个中最低的一个。

答案 1 :(得分:0)

实际的日期时间模块是用c语言编写的,所以overover实际上不是AFAIK的选项。 仔细检查我的逻辑,但我认为你正在寻找这样的东西。

def getWeekNumber(date):
     year,week,day = date.isocalendar()
     jan_1 = datetime.date(year=year,month=1,day=1)
     if jan_1.weekday()==3: //if jan 1 is a thursday, there is one less week 
         week-=1
     if day == 7: #Add a week if it is Sunday as its actually in the next week
         week+=1
     if week==53: #week 53 is actually week 0 of next year
         week = 0

     return week

这里的基本逻辑是,在isocalendar中,jan 1必须是星期四或更少才能计算为第一周,其格式是你必须是周三或更少。外面的情况是它的星期四1月1日 - >减少1周。

将所有星期日推到下周。

如果推送创建了第53周,则将周更改为0(第53周实际上是明年)

同样,这是未经测试的。