Aggiunta di 5 giorni a una data in Python


367

Ho una data "10/10/11(m-d-y)"e voglio aggiungervi 5 giorni usando uno script Python. Si prega di considerare una soluzione generale che funziona anche nel mese che termina.

Sto usando il seguente codice:

import re
from datetime import datetime

StartDate = "10/10/11"

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

print Date -> sta stampando '2011-10-10 00:00:00'

Ora voglio aggiungere 5 giorni a questa data. Ho usato il seguente codice:

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

Che ha restituito questo errore:

name 'timedelta' is not defined

12
Indizio generale: se ricevi l'errore name 'timedelta' is not defined, significa che non hai definito da timedeltanessuna parte. Python di solito è piuttosto informativo sui suoi messaggi di errore.
Katriel,

1
La ricerca non ha funzionato? Tutti questi esempi di codice avrebbero aiutato: stackoverflow.com/search?q=python+timedelta . Sembra che ci siano oltre 200 domande come questa.
S.Lott


9
Vuoi aggiungere cinque giorni, ma poi hai timedelta (giorni = 10) ... Sono confuso su da dove provengono i 10 e perché non è 5
FeifanZ

Risposte:


557

Le risposte precedenti sono corrette ma è generalmente una pratica migliore da fare:

import datetime

Quindi avrai, usando datetime.timedelta:

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

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

7
datetime.datetime - perché due volte?
paulmorriss,

59
l'importazione come "da datetime import datetime, timedelta" aggiungerebbe leggibilità al codice
Manel Clos

8
@paulmorriss: stai chiamando il strptimemetodo sulla datetimeclasse nel datetimemodulo, quindi devi specificare datetime.datetime.
Graeme Perrow,

6
Siamo tutti d'accordo sul fatto che nominare una classe di uso comune con lo stesso nome del modulo che la contiene sia un'idea stupida? Che cosa è datetime? Non puoi fare affidamento sulla convenzione per sapere, ma devi sempre guardare alle importazioni.
Xiong Chiamiov,

8
Lì il problema dell'eredità della coda lunga. "dovrebbe" essere from datetime import DateTimepoiché le classi sono CamelCased, ma datetime precede PEP8.
Aaron McMillin il

120

Importa timedeltae dateprima.

from datetime import timedelta, date

E date.today()tornerà il datetime di oggi, può essere che tu voglia

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

11
datetime.date.today () invece di Date.today ()
elsadek

2
@ dan-klasson Per me non funziona, l' dateoggetto non ha timedeltametodo. Quale versione di Python stai usando?
DrTyrsa,

@DrTyrsa Mio male. Dovrebbe essere:from datetime import timedelta, date; date.today() + timedelta(days=10)
dan-klasson il

21

Se stai già utilizzando i panda , puoi risparmiare un po 'di spazio non specificando il formato:

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

Ha funzionato bene per me. Grazie
renny il

12

Immagino che ti manchi qualcosa del genere:

from datetime import timedelta

12

Ecco un altro metodo per aggiungere giorni in data usando il relativedelta di 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')

Produzione:

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

Dopo 5 giorni: 30/06/2015 15:56:09


10

Se desideri aggiungere giorni fino ad oggi, puoi utilizzare questo codice

from datetime import datetime
from datetime import timedelta


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

9

Ecco una funzione per ottenere da ora + giorni specificati

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)

Uso:

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

1
Buon codice Ma il tuo IF per testare gli addDays in get_date non è necessario
Eduardo,

6

Per avere un codice meno dettagliato ed evitare conflitti di nomi tra datetime e datetime.datetime , è necessario rinominare le classi con i nomi CamelCase .

from datetime import datetime as DateTime, timedelta as TimeDelta

Quindi puoi fare quanto segue, che penso sia più chiaro.

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

Inoltre, non ci sarebbe conflitto di nomi se si desidera in import datetimeseguito.


0

usando timedeltas puoi fare:

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

In genere hai una risposta ora, ma forse anche la mia classe che ho creato sarà utile. Per me risolve tutti i miei requisiti che abbia mai avuto nei miei progetti 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)

Come usarlo

  1. self.tz = pytz.timezone("Europe/Warsaw") - qui si definisce il fuso orario che si desidera utilizzare nel progetto
  2. GetDate("2019-08-08").current()- In questo modo la data della stringa verrà convertita in oggetto sensibile al tempo con il fuso orario definito nel punto 1. Il formato stringa predefinito è, format="%Y-%m-%d"ma sentiti libero di cambiarlo. (es. GetDate("2019-08-08 08:45", format="%Y-%m-%d %H:%M").current())
  3. GetDate("2019-08-08").get_month_first_day() ritorna data data (stringa o oggetto) mese primo giorno
  4. GetDate("2019-08-08").get_month_last_day() restituisce la data indicata il mese scorso
  5. GetDate("2019-08-08").minimum_time() ritorna data data giorno inizio
  6. GetDate("2019-08-08").maximum_time() ritorna data data fine giornata
  7. GetDate("2019-08-08").time_delta_days({number_of_days})ritorna data + aggiungi {numero di giorni} (puoi anche chiamare: GetDate(timezone.now()).time_delta_days(-1)per ieri)
  8. GetDate("2019-08-08").time_delta_haours({number_of_hours}) simile a pt 7 ma lavorando su ore
  9. GetDate("2019-08-08").time_delta_seconds({number_of_seconds}) simile a pt 7 ma lavorando su secondi

0

Qualche volta dobbiamo usare la ricerca per data e data. Se utilizziamo date__range, dobbiamo aggiungere 1 giorni con to_date altrimenti il ​​queryset si svuoterà.

Esempio:

da timedelta di importazione datetime

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

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

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

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.