Différence entre deux dates en Python

138

J'ai deux dates différentes et je veux connaître la différence de jours entre elles. Le format de la date est AAAA-MM-JJ.

J'ai une fonction qui peut ajouter ou soustraire un nombre donné à une date:

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

où A est la date et x le nombre de jours que je veux ajouter. Et le résultat est une autre date.

J'ai besoin d'une fonction où je peux donner deux dates et le résultat serait un int avec une différence de date en jours.

mauguerra
la source
Notez que votre fonction addonDays échouera les jours DST.
fishinear
Vous avez raison. Je modifie déjà la fonction. Si vous ajoutez 3600 (une heure) fonctionnera.
mauguerra

Réponses:

273

Utilisez -pour obtenir la différence entre deux datetimeobjets et prendre le daysmembre.

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)
Fred Foo
la source
37
Très bonne réponse. Pour être clair, le résultat de (d2 - d1)sera un timedeltaobjet.
aganders3
J'ai cette erreur sur la console: l'objet de type 'datetime.datetime' n'a pas d'attribut 'strptime'
mauguerra
2
J'obtiens TypeError: l'objet 'int' n'est pas appelable quand j'essaye de faire .days () sur un objet timedelta et la documentation n'en fait pas non plus mention ( docs.python.org/2/library/datetime.html ).
user1761806
4
Pourriez-vous aussi le mentionner total_seconds? Je pense que c'est important car c'est ce que je m'attendais à obtenir lorsque j'ai essayé secondssans lire la documentation.
Martin Thoma
1
@ThejKiran Faites que d2 et d1 soient séparés exactement un jour et voyez si c'est ce que vous attendez ;-)
Martin Thoma
27

Une autre solution courte:

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()
0x8BADF00D
la source
3
La fonction ifdans la diff_datesfonction n'est-elle pas complètement inutile? Par la définition de la valeur absolue, abs(date1-date2)sera toujours égal à abs(date2-date1).
Blckknght
Au moins avec Python3.5, l'instruction print devrait ressembler à ceci: print ('{} jours entre {} et {}'. Format (result1, d1, d2))
Ernestas Kardzys
2

J'ai essayé le code posté par larsmans ci-dessus mais, il y a quelques problèmes:

1) Le code tel quel lèvera l'erreur comme mentionné par mauguerra 2) Si vous changez le code comme suit:

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

Cela convertira vos objets datetime en chaînes, mais deux choses

1) Essayer de faire d2 - d1 échouera car vous ne pouvez pas utiliser l'opérateur moins sur les chaînes et 2) Si vous lisez la première ligne de la réponse ci-dessus indiquée, vous voulez utiliser l'opérateur - sur deux objets datetime mais, vous les a convertis en chaînes

Ce que j'ai trouvé, c'est que vous n'avez besoin que de ce qui suit:

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
schalkneethling
la source
1
Mon code utilise datetime.strptimepour convertir des chaînes en datetimeobjets. Puisque l'OP a déclaré que «le format de la date est AAAA-MM-JJ», j'ai supposé que les dates étaient représentées sous forme de chaînes. Si ce n'est pas le cas, une conversion n'est évidemment pas nécessaire.
Fred Foo
0

Essaye ça:

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()
user8359392
la source
-4

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

ar91
la source