2011-12-07 30 views
57

Ho due date diverse e voglio sapere la differenza in giorni tra di loro. Il formato della data è AAAA-MM-GG.Differenza tra due date in Python

Ho una funzione che può aggiungere o sottrarre un dato numero a una data:

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 

dove A è la data e l'x il numero di giorni che voglio aggiungere. E il risultato è un altro appuntamento.

Ho bisogno di una funzione dove posso dare due date e il risultato sarebbe un int con differenza di data in giorni.

+1

possibile duplicato di [Come si calcola il numero di giorni tra due date utilizzando Python?] (Http://stackoverflow.com/questions/151199/how-do-i-calculate-number-of-days-betwen- two-dates-using-python) –

+0

Si noti che la funzione addonDays avrà esito negativo nei giorni dell'ora legale. – fishinear

+0

Hai ragione. Ho già modificato la funzione. Se aggiungi 3600 (un'ora) funzionerà. – mauguerra

risposta

134

Utilizzare - per ottenere la differenza tra due oggetti datetime e prendere il membro 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

Ottima risposta. Per essere chiari, il risultato di '(d2 - d1)' sarà un oggetto ['timedelta'] (http://docs.python.org/library/datetime.html#datetime.timedelta). – aganders3

+0

Ho questo errore sulla console: l'oggetto di tipo 'datetime.datetime' non ha attributo 'strptime' – mauguerra

+0

Ho già risolto il problema ..... ha funzionato molto bene GRAZIE !!! – mauguerra

2

ho provato il codice inviato da larsmans cui sopra, ma, ci sono un paio di problemi:

1) Il codice come è la volontà di gettare l'errore come detto da mauguerra 2) Se si modifica il codice al seguente:

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

Questo convertirà gli oggetti datetime in stringhe, ma, due cose

1) Cercando di fare d2 - d1 fallirà, come si può non utilizzare l'operatore meno sulle stringhe e 2) Se si legge la prima riga della risposta sopra indicata, si desidera utilizzare l'operatore - su due oggetti datetime ma, li hai appena convertiti in stringhe

Cosa ho trovato è che è letteralmente solo bisogno il seguente:

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

Il mio codice usa 'datetime.strptime' per convertire le stringhe in oggetti' datetime'.Dal momento che il PO ha dichiarato che "Il formato della data è AAAA-MM-GG", ho assunto che le date fossero rappresentate come stringhe. Se non lo sono, ovviamente non c'è bisogno di una conversione. –

14

Un altro breve soluzione:

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

Non è completamente inutile il comando 'if' nella funzione' diff_dates'? Con la definizione del valore assoluto, 'abs (date1-date2)' sarà sempre uguale a 'abs (date2-date1)'. – Blckknght

+0

Concordato :) Il post è stato aggiornato. Grazie. – 0x8BADF00D

+0

Almeno con Python3.5 la dichiarazione di stampa dovrebbe apparire così: stampa ('{} giorni tra {} e {}'. Formato (risultato1, d1, d2)) –

0

Prova questo:

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()