2011-12-07 39 views
57

我有兩個不同的日期,我想知道它們之間的差異。日期的格式是YYYY-MM-DD。Python中兩個日期之間的區別

我有一個可以加上或減去一個給定的數日期的功能:

def addonDays(a, x): 
    ret = time.strftime("%Y-%m-%d",time.localtime(time.mktime(time.strptime(a,"%Y-%m-%d"))+x*3600*24+3600))  
    return ret 

其中A是日期和X天我想補充的數量。結果是另一個日期。

我需要一個函數,我可以給出兩個日期,並且結果將會是一個以日期爲天數的int。

+1

可能的重複[我如何計算使用Python的兩個日期之間的天數?](http://stackoverflow.com/questions/151199/how-do-i-calculate-number-of-days-betwen-兩個日期使用python) –

+0

請注意,您的addonDays函數將在DST天失敗。 – fishinear

+0

你說得對。我已經修改了這個函數。如果你添加3600(一小時)將工作。 – mauguerra

回答

134

使用-可獲得兩個對象datetime之間的差異並取days成員。

from datetime import datetime 

def days_between(d1, d2): 
    d1 = datetime.strptime(d1, "%Y-%m-%d") 
    d2 = datetime.strptime(d2, "%Y-%m-%d") 
    return abs((d2 - d1).days) 
+16

很好的答案。清楚地說,'(d2-d1)'的結果將是['timedelta'](http://docs.python.org/library/datetime.html#datetime.timedelta)對象。 – aganders3

+0

我在控制檯上有這個錯誤: 類型對象'datetime.datetime'沒有屬性'strptime' – mauguerra

+0

我已經解決了這個問題.....它工作得很好THAANKS !!! – mauguerra

2

我試圖通過上述larsmans發佈,但是,有幾個問題的代碼:

1)是將拋出錯誤由mauguerra 2中提及)如果您更改代碼的代碼以下幾點:

... 
    d1 = d1.strftime("%Y-%m-%d") 
    d2 = d2.strftime("%Y-%m-%d") 
    return abs((d2 - d1).days) 

這將您的datetime對象轉換爲字符串,但是,兩件事情

1)試圖做D2 - D1將會失敗,你可以2)如果你讀到上面第一行的答案,它說,你想在兩個日期時間對象上使用 - 運算符,但是,你只是將它們轉換爲字符串

我發現是,你從字面上只需要以下條件:

import datetime 

end_date = datetime.datetime.utcnow() 
start_date = end_date - datetime.timedelta(days=8) 
difference_in_days = abs((end_date - start_date).days) 

print difference_in_days 
+1

我的代碼使用'datetime.strptime'將字符串轉換爲'datetime'對象。由於執行局稱「日期的格式爲YYYY-MM-DD」,我假定日期以字符串形式表示。如果他們不是,顯然不需要轉換。 –

14

另一個簡短的解決方案:

from datetime import date 

def diff_dates(date1, date2): 
    return abs(date2-date1).days 

def main(): 
    d1 = date(2013,1,1) 
    d2 = date(2013,9,13) 
    result1 = diff_dates(d2, d1) 
    print '{} days between {} and {}'.format(result1, d1, d2) 
    print ("Happy programmer's day!") 

main() 
+2

diff_dates函數中的if不是完全沒有必要的嗎?通過絕對值的定義,'abs(date1-date2)'將始終等於'abs(date2-date1)'。 – Blckknght

+0

同意:)發佈已更新。謝謝。 – 0x8BADF00D

+0

至少在Python3.5中,print語句應該如下所示: print({}和{}之間的{}}。格式(result1,d1,d2)) –

0

試試這個:

data=pd.read_csv('C:\Users\Desktop\Data Exploration.csv') 
data.head(5) 
first=data['1st Gift'] 
last=data['Last Gift'] 
maxi=data['Largest Gift'] 
l_1=np.mean(first)-3*np.std(first) 
u_1=np.mean(first)+3*np.std(first) 


m=np.abs(data['1st Gift']-np.mean(data['1st Gift']))>3*np.std(data['1st Gift']) 
pd.value_counts(m) 
l=first[m] 
data.loc[:,'1st Gift'][m==True]=np.mean(data['1st Gift'])+3*np.std(data['1st Gift']) 
data['1st Gift'].head() 




m=np.abs(data['Last Gift']-np.mean(data['Last Gift']))>3*np.std(data['Last Gift']) 
pd.value_counts(m) 
l=last[m] 
data.loc[:,'Last Gift'][m==True]=np.mean(data['Last Gift'])+3*np.std(data['Last Gift']) 
data['Last Gift'].head()