50

我正在尝试计算“一年中的几周”中两个日期之间的差异。我可以获取 datetime 对象并获取天数等,但不能获取周数。当然,我不能减去日期,因为这样不能保证周末。

我尝试使用d1.isocalendar()[1]和减去获得周数,d2.isocalendar()[1]但问题是isocalendar()[1]返回December 31, 2012为第 1 周(这应该是正确的),但这意味着我的逻辑不能跨越这个日期。

作为参考,这是我的完整代码:

def week_no(self):
    ents = self.course.courselogentry_set.all().order_by('lecture_date')
    l_no = 1
    for e in ents:
        if l_no == 1: 
             starting_week_of_year = e.lecture_date.isocalendar()[1] # get week of year
             initial_year = e.lecture_date.year   
        if e == self: 
            this_year = e.lecture_date.year
            offset_week = (this_year - initial_year) * 52
            w_no = e.lecture_date.isocalendar()[1] - starting_week_of_year + 1 + offset_week
            break 
        l_no += 1
    return w_no  

使用此代码,2012 年 12 月 31 日的讲座最终为 -35。

4

7 回答 7

69

如何计算各个日期几周内的星期一之间的周差?在以下代码中,monday1是星期一或之前d1(同一周):

from datetime import datetime, timedelta

monday1 = (d1 - timedelta(days=d1.weekday()))
monday2 = (d2 - timedelta(days=d2.weekday()))

print 'Weeks:', (monday2 - monday1).days / 7

如果两个日期都在一周内,则返回0 ,如果连续两周,则返回1 ,依此类推。

于 2013-01-07T07:53:06.723 回答
42

您可能需要参考 Python CookBook(2005 版)Recipe 3.3。以下代码片段来自食谱,可以满足您的要求。

from dateutil import rrule
import datetime
def weeks_between(start_date, end_date):
    weeks = rrule.rrule(rrule.WEEKLY, dtstart=start_date, until=end_date)
    return weeks.count()
于 2013-01-07T07:52:40.283 回答
24

这是一个非常简单的解决方案,每个人都能理解的编码更少。

from datetime import date

d1 = date(year, month, day)
d2 = date(year, month, day)
result = (d1-d2).days//7
于 2018-01-22T06:34:13.827 回答
2

确定两个日期跨越多少周。例如从 10 月 3 日到 10 月 13 日

    October 2015
Mo     5 12 19 26
Tu     6 13 20 27
We     7 14 21 28
Th  1  8 15 22 29
Fr  2  9 16 23 30
Sa  3 10 17 24 31
Su  4 11 18 25

代码:

    import math, datetime

    start_date = datetime.date(2015, 10, 3)
    start_date_monday = (start_date - datetime.timedelta(days=start_date.weekday()))
    end_date = datetime.date(2015, 10, 13)
    num_of_weeks = math.ceil((end_date - start_date_monday).days / 7.0)

等于 3 周。

于 2015-10-16T11:45:27.463 回答
2

上面的解决方案有一个错误(由于声誉低,我无法添加评论)。它不考虑小时差异。

# This code has a bug.
monday1 = (d1 - timedelta(days=d1.weekday()))
monday2 = (d2 - timedelta(days=d2.weekday()))

相隔一周以上的 2 个日期的反例:

Timestamp1: 1490208193270795 (22 Mar 2017 18:43:13 GMT)
Monday1: 20 Mar 2017 18:43:13 GMT

Timestamp2: 1489528488744290 (14 Mar 2017 21:54:48 GMT)
Monday2: 13 Mar 2017 21:54:48 GMT

使用该代码,它在应该为 1 时返回 0 作为周差异。还需要将小时/分钟/秒归零。

于 2017-03-22T21:41:24.680 回答
0

您对“周差”的确切含义有些模糊。6天的差异是一周还是零?八天是一周还是两周?

在任何情况下,您为什么不能简单地找到另一个单位(秒或天)的差异并除以适当的数量,并使用您喜欢的四舍五入数周?

于 2013-01-07T07:52:22.670 回答
0

编辑最佳答案

from datetime import timedelta
monday1 = (d1 - timedelta(days=d1.weekday()))
monday2 = (d2 - timedelta(days=d2.weekday()))
diff = monday2 - monday1
noWeeks = (diff.days / 7)  + math.ceil(diff.seconds/86400)
print('Weeks:', noWeeks)`
于 2020-12-03T05:58:29.880 回答