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.