Differenza tra due date in Python


137

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

Ho una funzione che può aggiungere o sottrarre un determinato 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 x il numero di giorni che voglio aggiungere. E il risultato è un'altra data.

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



Nota che la tua funzione addonDays fallirà nei giorni DST.
Fishinear dal

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

Risposte:


272

Utilizzare -per ottenere la differenza tra due datetimeoggetti e prendere il daysmembro.

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)

37
Bella risposta. Per essere chiari, il risultato di (d2 - d1)sarà un timedeltaoggetto.
aganders3,

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

2
Ottengo TypeError: l'oggetto 'int' non è richiamabile quando provo a fare .days () su un oggetto timedelta e la documentazione non ne parla nemmeno ( docs.python.org/2/library/datetime.html ).
user1761806,

4
Potresti citare total_secondsanche tu ? Penso che sia importante in quanto è quello che mi aspettavo di ottenere quando ho provato secondssenza leggere i documenti.
Martin Thoma,

1
@ThejKiran Fai in modo che d2 e d1 siano separati esattamente un giorno e vedi se è quello che ti aspetti ;-)
Martin Thoma

27

Un'altra soluzione breve:

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

3
Non è la ifnella diff_datesfunzione di completamente inutile? Con la definizione del valore assoluto, abs(date1-date2)sarà sempre uguale a abs(date2-date1).
Blckknght,

Almeno con Python3.5 l'istruzione print dovrebbe apparire così: print ('{} giorni tra {} e {}'. Formato (risultato1, d1, d2))
Ernestas Kardzys

2

Ho provato il codice pubblicato da Larsmans sopra, ma ci sono un paio di problemi:

1) Il codice così com'è genererà l'errore come indicato da mauguerra 2) Se si modifica il codice nel modo seguente:

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

Questo convertirà i tuoi oggetti datetime in stringhe ma, due cose

1) Provare a fare d2 - d1 fallirà perché non puoi usare l'operatore meno sulle stringhe e 2) Se leggi la prima riga della risposta sopra indicata, vuoi usare l'operatore - su due oggetti datetime ma, semplicemente li ha convertiti in stringhe

Quello che ho scoperto è che hai letteralmente bisogno solo di quanto segue:

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.strptimeper convertire stringhe in datetimeoggetti. Poiché il PO ha dichiarato che "Il formato della data è AAAA-MM-GG", ho ipotizzato che le date fossero rappresentate come stringhe. In caso contrario, non è ovviamente necessario eseguire una conversione.
Fred Foo,

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

-4

pd.date_range ('2019-01-01', '2019-02-01'). shape [0]

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.