Python确定一年中的一周(非ISO方式)

时间:2011-02-06 23:51:15

标签: .net python

是否有一种pythonic方法可以在.NET中获得以下内容?

CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(dt.Date, CalendarWeekRule.FirstDay, DayOfWeek.Monday)

dt.isocalendar()[1]似乎对我不起作用,因为它为datetime.date(2010, 1, 1)

返回53(期待52)

感谢。

1 个答案:

答案 0 :(得分:2)

ISO日历有一系列令人困惑的规则,可能是您在此处遇到的问题的根源。特别是,GetWeekOfYear的.NET实现(使用您使用的参数)与ISO非常相似,explicit clarifications需要MSDNIs .NET giving me the wrong week number for Dec. 29th 2008?。结果是isocalendarGetWeekOfYear会产生不同的结果[我的重点]:

  

具体而言,ISO 8601始终有7天的周。如果一年的第一个部分周不包含星期四,那么它将被计为上一年的最后一周。同样,如果上一年的最后一周不包含星期四那么它将被视为下一年的第一周。 GetWeekOfYear()有第一个行为,但不是第二个行为。

有关纠正GetWeekOfYear的一些建议,请参阅上面的链接以及{{3}}如果您确实想要匹配GetWeekOfYear行为,这两个链接会有所帮助,尽管您将申请反向转化为他们的例子。

最“Pythonic”的做法是创建一个函数。这里没有什么特别的,除了通常通过day < 4而不是day == 1 or day == 2 ...之类的事情来最小化代码的尝试。

(当然,所有这一切都假设Python的isocalendar正确匹配ISO日历。文档似乎表明它确实存在,GetWeekOfYear明确指出它没有,所以这似乎是一个合理的假设。但是,如果这是一个关键的计算,你将自己彻底测试它。)