Hinzufügen von 5 Tagen zu einem Datum in Python


366

Ich habe ein Datum "10/10/11(m-d-y)"und möchte es mit einem Python-Skript um 5 Tage verlängern. Bitte beachten Sie eine allgemeine Lösung, die auch am Monatsende funktioniert.

Ich verwende folgenden Code:

import re
from datetime import datetime

StartDate = "10/10/11"

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

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

Jetzt möchte ich diesem Datum 5 Tage hinzufügen. Ich habe den folgenden Code verwendet:

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

Was diesen Fehler zurückgegeben hat:

name 'timedelta' is not defined

12
Allgemeiner Hinweis: Wenn Sie den Fehler erhalten name 'timedelta' is not defined, bedeutet dies, dass Sie timedeltanirgendwo definiert haben . Python ist normalerweise ziemlich informativ über seine Fehlermeldungen.
Katriel

1
Suche hat nicht funktioniert? Alle diese Codebeispiele hätten geholfen: stackoverflow.com/search?q=python+timedelta . Es scheint über 200 Fragen wie diese zu geben.
S.Lott


9
Sie möchten fünf Tage hinzufügen, aber dann haben Sie Zeitdelta (Tage = 10) ... Ich bin verwirrt darüber, woher die 10 kamen und warum es nicht 5 ist
FeifanZ

Antworten:


556

Die vorherigen Antworten sind korrekt, aber es ist im Allgemeinen eine bessere Vorgehensweise:

import datetime

Dann haben Sie mit datetime.timedelta:

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

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

7
datetime.datetime - warum zweimal?
Paulmorriss

59
Importieren wie "von datetime import datetime, timedelta" würde die Lesbarkeit des Codes erhöhen
Manel Clos

8
@paulmorriss: Sie rufen die strptimeMethode für die datetimeKlasse im datetimeModul auf, daher müssen Sie angeben datetime.datetime.
Graeme Perrow

6
Können wir uns alle einig sein, dass es eine blöde Idee ist, eine häufig verwendete Klasse mit dem Namen des Moduls zu benennen, das sie enthält? Was ist datetime? Sie können sich nicht auf Konventionen verlassen, um dies zu wissen, sondern müssen sich immer die Importe ansehen.
Xiong Chiamiov

8
Long Tail Legacy Problem dort. es "sollte" sein, from datetime import DateTimeda Klassen CamelCased sind, aber datetime vor PEP8 steht.
Aaron McMillin

120

Importieren timedeltaund datezuerst.

from datetime import timedelta, date

Und date.today()wird die heutige Datumszeit zurückgeben, vielleicht möchten Sie

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

11
datetime.date.today () anstelle von Date.today ()
elsadek

2
@ dan-klasson Es funktioniert nicht bei mir, dateObjekt hat keine timedeltaMethode. Welche Python-Version verwenden Sie?
DrTyrsa

@ DrTyrsa Mein schlechtes. Sollte sein:from datetime import timedelta, date; date.today() + timedelta(days=10)
Dan-Klasson

21

Wenn Sie bereits Pandas verwenden , können Sie ein wenig Platz sparen, indem Sie das Format nicht angeben:

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

Hat gut für mich funktioniert. Danke
renny

12

Ich denke, Ihnen fehlt so etwas:

from datetime import timedelta

12

Hier ist eine weitere Methode zum Hinzufügen von Tagen am Datum mithilfe des relativedelta von 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')

Ausgabe:

Heute: 25/06/2015 15:56:09

Nach 5 Tagen: 30/06/2015 15:56:09


10

Wenn Sie jetzt Tage hinzufügen möchten, können Sie diesen Code verwenden

from datetime import datetime
from datetime import timedelta


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

9

Hier ist eine Funktion zum Abrufen von + angegebenen Tagen

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)

Verwendungszweck:

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

1
Guter Code. Aber Ihre IF, um die addDays in get_date zu testen, ist nicht erforderlich
Eduardo

6

Um einen weniger ausführlichen Code zu haben und Namenskonflikte zwischen datetime und datetime.datetime zu vermeiden , sollten Sie die Klassen mit CamelCase- Namen umbenennen .

from datetime import datetime as DateTime, timedelta as TimeDelta

Sie können also Folgendes tun, was meiner Meinung nach klarer ist.

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

Außerdem würde es keinen Namenskonflikt geben, wenn Sie import datetimespäter möchten .


0

Mit timedeltas können Sie Folgendes tun:

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

Im Allgemeinen haben Sie jetzt keine Antwort erhalten, aber vielleicht ist meine von mir erstellte Klasse auch hilfreich. Für mich löst es alle meine Anforderungen, die ich jemals in meinen Pyhon-Projekten hatte.

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)

Wie man es benutzt

  1. self.tz = pytz.timezone("Europe/Warsaw") - Hier definieren Sie die Zeitzone, die Sie im Projekt verwenden möchten
  2. GetDate("2019-08-08").current()- Dadurch wird Ihr Zeichenfolgendatum in ein zeitbewusstes Objekt mit der in Punkt 1 definierten Zeitzone konvertiert. Das Standardzeichenfolgenformat ist, Sie können es format="%Y-%m-%d"jedoch jederzeit ändern. (zB GetDate("2019-08-08 08:45", format="%Y-%m-%d %H:%M").current())
  3. GetDate("2019-08-08").get_month_first_day() Gibt das angegebene Datum (Zeichenfolge oder Objekt) des ersten Monats des Monats zurück
  4. GetDate("2019-08-08").get_month_last_day() Gibt das Datum des letzten Monats zurück
  5. GetDate("2019-08-08").minimum_time() Gibt das angegebene Datum und den Start des Tages zurück
  6. GetDate("2019-08-08").maximum_time() Gibt das angegebene Datum und das Ende des Tages zurück
  7. GetDate("2019-08-08").time_delta_days({number_of_days})gibt das angegebene Datum zurück + add {Anzahl der Tage} (Sie können auch anrufen: GetDate(timezone.now()).time_delta_days(-1)für gestern)
  8. GetDate("2019-08-08").time_delta_haours({number_of_hours}) ähnlich wie Punkt 7, aber stundenlang arbeiten
  9. GetDate("2019-08-08").time_delta_seconds({number_of_seconds}) ähnlich wie Punkt 7, arbeitet aber an Sekunden

0

Einige Zeit müssen wir die Suche nach Datum und Datum verwenden. Wenn wir date__range verwenden, müssen wir 1 Tage mit to_date hinzufügen, da sonst das Abfrageset leer wird.

Beispiel:

von datetime import timedelta

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

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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.