222 votes

Différence entre deux dates en Python

J'ai deux dates différentes et je veux connaître la différence en 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 la différence de date en jours.

0 votes

Notez que votre fonction addonDays échouera les jours de l'heure d'été.

0 votes

Vous avez raison. J'ai déjà modifié la fonction. Si vous ajoutez 3600 (une heure), cela fonctionnera.

430voto

larsmans Points 167484

Utilice - pour obtenir la différence entre deux datetime et prendre les days membre.

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)

60 votes

Excellente réponse. Pour être clair, le résultat de (d2 - d1) sera un timedelta objet.

1 votes

J'ai cette erreur dans la console : l'objet de type 'datetime.datetime' n'a pas d'attribut 'strptime'.

3 votes

J'obtiens TypeError : 'int' object is not callable quand j'essaie de faire .days() sur un objet timedelta et la documentation ne le mentionne pas non plus ( docs.python.org/2/library/datetime.html ).

47voto

0x8BADF00D Points 316

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

3 votes

N'est-ce pas le if dans le diff_dates fonction complètement inutile ? Par la définition de la valeur absolue, abs(date1-date2) sera toujours égal à abs(date2-date1) .

0 votes

Au moins avec Python3.5, l'instruction print devrait ressembler à ceci : print ('{} jours entre {} et {}'.format(result1, d1, d2))

9voto

Tomerikoo Points 12045

Vous pouvez utiliser le bibliothèque tierce dateutil qui est une extension de la fonction intégrée datetime .

L'analyse des dates avec la fonction parser est très simple :

from dateutil import parser

date1 = parser.parse('2019-08-01')
date2 = parser.parse('2019-08-20')

diff = date2 - date1

print(diff)
print(diff.days)

Réponse basée sur celle de ce duplicata supprimé

6voto

schalkneethling Points 437

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

1) Le code tel quel produira l'erreur mentionnée par mauguerra. 2) Si vous modifiez 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 de caractères mais, deux choses

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

Ce que j'ai découvert, c'est que vous n'avez littéralement besoin que des éléments suivants :

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 votes

Mon code utilise datetime.strptime pour convertir les chaînes de caractères en datetime objets. Puisque le PO indique 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 de caractères. Si ce n'est pas le cas, il n'y a évidemment pas besoin d'une conversion.

2voto

user8359392 Points 11

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X