1

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

  1. 一周从周日开始,到周六结束。
  2. 一年中的第一周在 1 月的第一个星期六结束,只要它在该月至少四天,即使这意味着第一周从 12 月开始。

我知道datetime.datetime.isocalendar()返回的结果相似,但是这一周从星期一开始。该time.strftime('%U',<tuple>)模块返回从星期日开始的周数,但它将一年中的第一周视为在第一个星期六结束的一周(不考虑一周中至少有 4 天在 1 月)。有没有一个模块可以让我根据我上面的定义找到周数?否则有人可以建议一种方法来超载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 步:确定 so 获得的第一周是否包含第一个星期三。

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

4

2 回答 2

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)

这将从零开始计数。

要找出某一天属于哪一年,只有三种可能性:它的公历年、后年或前年。您感兴趣的是这三个 where 中最低的一个first_sunday(year) <= arbitrary_date

于 2013-05-27T08:58:23.480 回答
0

实际的日期时间模块是用 c 编写的,因此覆盖并不是真正的选项 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 中,1 月 1 日必须是星期四或更短的时间才能算作第一周,而格式必须是星期三或更短时间。外部情况是 1 月 1 日星期四 -> 将周减少 1。

将所有星期日推到下周。

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

同样,这是未经测试的。

于 2013-05-27T08:15:06.630 回答