2013-01-07 65 views
15

我試圖計算「一週中的兩個日期」中兩個日期之間的差異。我可以得到日期時間對象,並獲得日期等,但不是週數。當然,我不能減去日期,因爲週末不能保證。如何計算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 

有了這個代碼,在12月31日的演講中,2012最終是-35。

回答

27

如何個別日期的兩週內計算星期一之間在周區別?在下面的代碼,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 

返回,如果這兩個日期屬於某一週withing 如果連續兩週,等

+0

你能僅僅通過解釋它,特別是在'monday1'並闡述你的代碼'monday2'計算。 –

+0

完美工作,跨越幾年和幾周。非常簡潔。非常感謝:) – recluze

+0

我得到一個錯誤與'天()':'(PDB)(monday2 - monday1).days() ***類型錯誤: '詮釋' 對象不是可調用 (PDB)(monday2 - 星期一1).days 77' – otmezger

0

你對「星期的差別」究竟意味着什麼含糊不清。 6天相差一週還是零?一兩個星期相差八天嗎?

在任何情況下,爲什麼你不能簡單地找到另一個單位(秒或天)的差異和除以適當的數額,你喜歡四捨五入?

+0

感謝您的輸入。我實際上是在談論「一週中的差異」。所以說「6天」是不夠的。如果第一天是星期一,二是週四,周不同的是0,但如果是週六,二是星期天,周不同的是1 – recluze

26

您可能想要參考Python CookBook(2005年版)配方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() 
+0

感謝。還沒有測試過,但即使它工作,我認爲eumiro的解決方案更優雅。 +1雖然一個替代:) – recluze

1

確定兩個日期跨越多少個星期。例如,從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周。

0

上面的解決方案有一個錯誤(由於低信譽我無法添加評論)。它沒有考慮小時差異。使用該代碼作爲周DIFF返回0時,它應該是1.需要零出小時/分/秒

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 

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

計數器2周的日期超過一週相隔的例子以及。

0

這是用較少的編碼大家一個非常簡單的解決辦法理解。

from datetime import date 

d1 = date(year, month, day) 
d2 = date(year, month, day) 
result = (d1-d2).days//7 
相關問題