[英]How to calculate difference between two dates in weeks in python
我正在尝试计算“一年中的几周”中两个日期之间的差异。 我可以获取日期时间对象并获取天数等,但不能获取周数。 当然,我不能减去日期,因为不能保证周末。
我尝试使用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。
如何计算各个日期数周内的星期一之间的周数差异? 在以下代码中, 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,这两个日期不在withing一个星期1,如果在连续两周,等
您可能需要参考 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()
这是一个非常简单的解决方案,每个人都能理解的编码更少。
from datetime import date
d1 = date(year, month, day)
d2 = date(year, month, day)
result = (d1-d2).days//7
确定两个日期跨越多少周。 例如从 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 周。
上面的解决方案有一个错误(由于声誉低,我无法添加评论)。 它不考虑小时差异。
# This code has a bug.
monday1 = (d1 - timedelta(days=d1.weekday()))
monday2 = (d2 - timedelta(days=d2.weekday()))
两个日期相隔一周以上的反例:
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 作为周差异。还需要将小时/分钟/秒归零。
您对“周差异”的确切含义有些含糊。 6 天的差异是一周还是零? 八天是一星期还是两个星期?
在任何情况下,您为什么不能简单地找到另一个单位(秒或天)中的差异并除以适当的数量,并使用您喜欢的周数四舍五入?
编辑最佳答案
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)`
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.