对于给定日期,我必须按照以下规则查找一年中的周数:
我知道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)
,这显然是星期二!!
答案 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周实际上是明年)
同样,这是未经测试的。