【问题标题】:Finding week of year with week ending on Saturday and first week containing atleast 4 days, in python在python中查找以周六结束的一周和包含至少4天的第一周的一年中的一周
【发布时间】:2013-05-27 00:54:02
【问题描述】:

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

  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),这显然是星期二!!

【问题讨论】:

  • 欢迎您。如果我理解您需要知道给定日期的包含该日期的星期的序数(1 到 52 或 53 之间),我说得对吗?
  • @Luc125 感谢您的欢迎。是的,我想要一周的序数。 isocalendar() 给出相同的值,但它从星期一开始一周。

标签: python datetime week-number weekday


【解决方案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

如果你愿意,你可以通过实现一个类似于itertools.countdatecount 函数来使这个阅读更好一些,这样你就有了:

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这三个中最低的一个。

【讨论】:

  • 有点工作.. 正在寻找更优雅的东西。但谢谢你。
【解决方案2】:

实际的 datetime 模块是用 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 周实际上是在明年)

同样,这是未经测试的。

【讨论】:

  • 感谢您的代码。但我不认为这个逻辑是完全正确的。 (我对week==53 部分感到紧张)。例如,让我们考虑20082009 之间的边界。 Jan 3, 20092009 的第一个星期六,那一周只有一月的三天。因此,Jan 2, 2009 的周数是 2008-53
猜你喜欢
  • 2016-11-29
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
  • 2021-03-11
  • 2017-12-07
  • 1970-01-01
相关资源
最近更新 更多