Ajout de 5 jours à une date en Python


367

J'ai une date "10/10/11(m-d-y)"et je veux lui ajouter 5 jours en utilisant un script Python. Veuillez envisager une solution générale qui fonctionne également les fins de mois.

J'utilise le code suivant:

import re
from datetime import datetime

StartDate = "10/10/11"

Date = datetime.strptime(StartDate, "%m/%d/%y")

print Date -> imprime '2011-10-10 00:00:00'

Maintenant, je veux ajouter 5 jours à cette date. J'ai utilisé le code suivant:

EndDate = Date.today()+timedelta(days=10)

Qui a renvoyé cette erreur:

name 'timedelta' is not defined

12
Indice général: si vous obtenez l'erreur name 'timedelta' is not defined, cela signifie que vous n'avez défini timedeltanulle part. Python est généralement assez informatif sur ses messages d'erreur.
Katriel

1
La recherche n'a pas fonctionné? Tous ces exemples de code auraient aidé: stackoverflow.com/search?q=python+timedelta . Il semble y avoir plus de 200 questions comme celle-ci.
S.Lott


9
Vous voulez ajouter cinq jours, mais vous avez ensuite timedelta (jours = 10)… Je ne sais pas d'où viennent les 10 et pourquoi ce n'est pas 5
FeifanZ

Réponses:


557

Les réponses précédentes sont correctes mais c'est généralement une meilleure pratique à faire:

import datetime

Ensuite, vous aurez, en utilisant datetime.timedelta:

date_1 = datetime.datetime.strptime(start_date, "%m/%d/%y")

end_date = date_1 + datetime.timedelta(days=10)

7
datetime.datetime - pourquoi deux fois?
paulmorriss

59
importer comme "from datetime import datetime, timedelta" ajouterait la lisibilité du code
Manel Clos

8
@paulmorriss: Vous appelez la strptimeméthode sur la datetimeclasse du datetimemodule, vous devez donc la spécifier datetime.datetime.
Graeme Perrow

6
Pouvons-nous tous convenir que nommer une classe couramment utilisée du même nom que le module qui la contient est une idée stupide? Qu'est-ce que c'est datetime? Vous ne pouvez pas compter sur la convention pour savoir, mais vous devez toujours regarder les importations.
Xiong Chiamiov

8
Problème hérité de la longue queue. il "devrait" être from datetime import DateTimepuisque les classes sont CamelCased, mais datetime précède PEP8.
Aaron McMillin

120

Importer timedeltaet d' dateabord.

from datetime import timedelta, date

Et date.today()renverra la date et l'heure d'aujourd'hui, peut-être voulez-vous

EndDate = date.today() + timedelta(days=10)

11
datetime.date.today () au lieu de Date.today ()
elsadek

2
@ dan-klasson Cela ne fonctionne pas pour moi, l' dateobjet n'a pas de timedeltaméthode. Quelle version de Python utilisez-vous?
DrTyrsa

@DrTyrsa My bad. Devrait être:from datetime import timedelta, date; date.today() + timedelta(days=10)
dan-klasson

21

Si vous utilisez déjà des pandas , vous pouvez économiser un peu d'espace en ne spécifiant pas le format:

import pandas as pd
startdate = "10/10/2011"
enddate = pd.to_datetime(startdate) + pd.DateOffset(days=5)

Ça a bien marché pour moi. Merci
renny

12

Je suppose que vous manquez quelque chose comme ça:

from datetime import timedelta

12

Voici une autre méthode pour ajouter des jours à la date en utilisant relativedelta de dateutil .

from datetime import datetime
from dateutil.relativedelta import relativedelta

print 'Today: ',datetime.now().strftime('%d/%m/%Y %H:%M:%S') 
date_after_month = datetime.now()+ relativedelta(days=5)
print 'After 5 Days:', date_after_month.strftime('%d/%m/%Y %H:%M:%S')

Production:

Aujourd'hui: 25/06/2015 15:56:09

Après 5 jours: 30/06/2015 15:56:09


10

Si vous souhaitez ajouter des jours à ce jour, vous pouvez utiliser ce code

from datetime import datetime
from datetime import timedelta


date_now_more_5_days = (datetime.now() + timedelta(days=5) ).strftime('%Y-%m-%d')

9

Voici une fonction pour obtenir à partir de maintenant + jours spécifiés

import datetime

def get_date(dateFormat="%d-%m-%Y", addDays=0):

    timeNow = datetime.datetime.now()
    if (addDays!=0):
        anotherTime = timeNow + datetime.timedelta(days=addDays)
    else:
        anotherTime = timeNow

    return anotherTime.strftime(dateFormat)

Usage:

addDays = 3 #days
output_format = '%d-%m-%Y'
output = get_date(output_format, addDays)
print output

1
Bon code. Mais votre IF pour tester les addDays dans get_date n'est pas nécessaire
Eduardo

6

Afin d'avoir un code moins détaillé et d'éviter les conflits de nom entre datetime et datetime.datetime , vous devez renommer les classes avec des noms CamelCase .

from datetime import datetime as DateTime, timedelta as TimeDelta

Vous pouvez donc faire ce qui suit, ce qui, je pense, est plus clair.

date_1 = DateTime.today() 
end_date = date_1 + TimeDelta(days=10)

De plus, il n'y aurait pas de conflit de nom si vous le souhaitez import datetimeultérieurement.


0

en utilisant timedeltas, vous pouvez faire:

import datetime
today=datetime.date.today()


time=datetime.time()
print("today :",today)

# One day different .
five_day=datetime.timedelta(days=5)
print("one day :",five_day)
#output - 1 day , 00:00:00


# five day extend .
fitfthday=today+five_day
print("fitfthday",fitfthday)


# five day extend .
fitfthday=today+five_day
print("fitfthday",fitfthday)
#output - 
today : 2019-05-29
one day : 5 days, 0:00:00
fitfthday 2019-06-03

0

En général, vous n'avez pas de réponse maintenant, mais peut-être que ma classe que j'ai créée sera également utile. Pour moi, cela résout toutes mes exigences que j'ai jamais eues dans mes projets Pyhon.

class GetDate:
    def __init__(self, date, format="%Y-%m-%d"):
        self.tz = pytz.timezone("Europe/Warsaw")

        if isinstance(date, str):
            date = datetime.strptime(date, format)

        self.date = date.astimezone(self.tz)

    def time_delta_days(self, days):
        return self.date + timedelta(days=days)

    def time_delta_hours(self, hours):
        return self.date + timedelta(hours=hours)

    def time_delta_seconds(self, seconds):
        return self.date + timedelta(seconds=seconds)

    def get_minimum_time(self):
        return datetime.combine(self.date, time.min).astimezone(self.tz)

    def get_maximum_time(self):
        return datetime.combine(self.date, time.max).astimezone(self.tz)

    def get_month_first_day(self):
        return datetime(self.date.year, self.date.month, 1).astimezone(self.tz)

    def current(self):
        return self.date

    def get_month_last_day(self):
        lastDay = calendar.monthrange(self.date.year, self.date.month)[1]
        date = datetime(self.date.year, self.date.month, lastDay)
        return datetime.combine(date, time.max).astimezone(self.tz)

Comment l'utiliser

  1. self.tz = pytz.timezone("Europe/Warsaw") - ici vous définissez le fuseau horaire que vous souhaitez utiliser dans le projet
  2. GetDate("2019-08-08").current()- cela convertira la date de votre chaîne en objet sensible au temps avec le fuseau horaire que vous avez défini au pt 1. Le format de chaîne par défaut est, format="%Y-%m-%d"mais n'hésitez pas à le modifier. (par exemple. GetDate("2019-08-08 08:45", format="%Y-%m-%d %H:%M").current())
  3. GetDate("2019-08-08").get_month_first_day() renvoie la date donnée (chaîne ou objet) mois premier jour
  4. GetDate("2019-08-08").get_month_last_day() renvoie la date donnée le mois dernier
  5. GetDate("2019-08-08").minimum_time() renvoie la date donnée le début du jour
  6. GetDate("2019-08-08").maximum_time() renvoie la date donnée en fin de journée
  7. GetDate("2019-08-08").time_delta_days({number_of_days})renvoie la date donnée + ajouter {nombre de jours} (vous pouvez également appeler: GetDate(timezone.now()).time_delta_days(-1)pour hier)
  8. GetDate("2019-08-08").time_delta_haours({number_of_hours}) similaire au pt 7 mais travaillant sur les heures
  9. GetDate("2019-08-08").time_delta_seconds({number_of_seconds}) similaire au pt 7 mais travaillant sur les secondes

0

Un certain temps, nous devons utiliser la recherche par date et date. Si nous utilisons date__range, nous devons ajouter 1 jour avec to_date, sinon queryset sera vide.

Exemple:

depuis datetime import timedelta

from_date = parse_date (request.POST ['from_date'])

to_date = parse_date (request.POST ['to_date']) + timedelta (jours = 1)

attend_list = models.DailyAttendance.objects.filter (attdate__range = [from_date, to_date])

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.