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.