Agregar días a una fecha en Python

490

Tengo una fecha "10/10/11(m-d-y)"y quiero agregarle 5 días usando un script de Python. Considere una solución general que funcione también a fines de mes.

Estoy usando el siguiente código:

import re
from datetime import datetime

StartDate = "10/10/11"

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

print Date -> está imprimiendo '2011-10-10 00:00:00'

Ahora quiero agregar 5 días a esta fecha. Use el siguiente código:

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

Que devolvió este error:

name 'timedelta' is not defined
4
  • 19
    Pista general: si obtiene el error name 'timedelta' is not defined, eso significa que no ha definido en timedeltaningún lugar. Python suele ser bastante informativo sobre sus mensajes de error.
    Katriel
    29/07/11 a las 10:06
  • 1
    ¿La búsqueda no funcionó? Todos estos ejemplos de código habrían ayudado: stackoverflow.com/search?q=python+timedelta . Parece haber más de 200 preguntas como esta.
    S.Lott
    29/07/11 a las 10:08
  • 1
  • 14
    Quiere agregar cinco días, pero luego tiene timedelta (días = 10)… Estoy confundido acerca de dónde provienen los 10 y por qué no son 5
    FeifanZ
    7 de enero de 2013 a las 0:53
734

Las respuestas anteriores son correctas, pero generalmente es una mejor práctica:

import datetime

Entonces tendrás, usando datetime.timedelta:

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

end_date = date_1 + datetime.timedelta(days=10)
9
  • 9
    datetime.datetime - ¿por qué dos veces? 11/08/2014 a las 9:11
  • 86
    importar como "desde datetime import datetime, timedelta" agregaría legibilidad al código 12/11/2014 a las 13:31
  • 11
    @paulmorriss: está llamando al strptimemétodo en la datetimeclase en el datetimemódulo, por lo que debe especificar datetime.datetime. 6 de enero de 2015 a las 22:43
  • 12
    ¿Podemos estar todos de acuerdo en que nombrar una clase de uso común con el mismo nombre que el módulo que la contiene es una idea tonta? ¿Qué es datetime? No se puede confiar en la convención para saberlo, pero siempre hay que mirar las importaciones. 5 de junio de 2017 a las 17:47
  • 13
    Hay un problema de legado de cola larga. "debería" ser from datetime import DateTimeya que las clases están basadas en Camel, pero datetime precede a PEP8. 26/06/17 a las 20:28
150

Importar timedeltay dateprimero.

from datetime import timedelta, date

Y date.today()devolverá la fecha y hora de hoy, tal vez lo desee

EndDate = date.today() + timedelta(days=10)
4
  • 11
    datetime.date.today () en lugar de Date.today ()
    elsadek
    6 de agosto de 2014 a las 15:19
  • 2
    @ dan-klasson No me funciona, el dateobjeto no tiene timedeltamétodo. ¿Qué versión de Python estás usando?
    DrTyrsa
    17 de julio de 2017 a las 6:32
  • @DrTyrsa Mi mal. Debiera ser:from datetime import timedelta, date; date.today() + timedelta(days=10) 17 de julio de 2017 a las 7:07
  • Estoy usando Python 3.7. Trabajó para mi. Muchas gracias. 26 de junio a las 11:23
31

Si ya está usando pandas , puede ahorrar un poco de espacio al no especificar el formato:

import pandas as pd
startdate = "10/10/2011"
enddate = pd.to_datetime(startdate) + pd.DateOffset(days=5)
4
  • Funcionó bien para mí. Gracias
    renny
    30/04/19 a las 9:18
  • Gracias, funciono para mi
    siraj
    24 de marzo a las 15:46
  • 2
    Solo quiero tener en cuenta que instalar pandas solo para esto es una exageración. 29 mar a las 22:04
  • Esta fue la mejor respuesta para mí porque ya estaba usando pandas y no quería importar otra biblioteca. 30 de julio a las 3:07
15

Si desea agregar días hasta la fecha ahora, puede usar este código

from datetime import datetime
from datetime import timedelta


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

Aquí hay otro método para agregar días en la fecha usando el valor relativo 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')

Producción:

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

After 5 Days: 30/06/2015 15:56:09

1
  • 1
    relateddelta es especialmente útil cuando se realizan operaciones en el mes, el año, etc. 20 de agosto de 2020 a las 4:11
12

Supongo que te estás perdiendo algo así:

from datetime import timedelta
9

Aquí hay una función de obtener a partir de ahora + días especificados

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
  • 1
    Buen codigo. Pero su IF para probar los addDays en get_date no es necesario
    Eduardo
    24 nov 2014 a las 15:09
7

Para tener un código menos detallado y evitar conflictos de nombres entre datetime y datetime.datetime , debe cambiar el nombre de las clases con los nombres de CamelCase .

from datetime import datetime as DateTime, timedelta as TimeDelta

Entonces puedes hacer lo siguiente, que creo que es más claro.

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

Además, no habría ningún conflicto de nombres si lo desea import datetimemás adelante.

6

Esto podría ayudar:

from datetime import date, timedelta
date1 = date(2011, 10, 10)
date2 = date1 + timedelta(days=5)
print (date2)
1
  • hay un pequeño error tipográfico, en la tercera línea debería ser date2 = date1 + timedelta (days = 5) 7 de abril a las 14:44
0

usando timedeltas puedes hacer:

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 general, ahora tiene una respuesta, pero tal vez mi clase que creé también sea útil. Para mí resuelve todos los requisitos que he tenido en mis proyectos de 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)

Cómo usarlo

  1. self.tz = pytz.timezone("Europe/Warsaw") - aquí define la zona horaria que desea utilizar en el proyecto
  2. GetDate("2019-08-08").current()- esto convertirá la fecha de la cadena en un objeto que reconozca la hora con la zona horaria que definió en el punto 1. El formato de cadena predeterminado es, format="%Y-%m-%d"pero siéntase libre de cambiarlo. (p. ej. GetDate("2019-08-08 08:45", format="%Y-%m-%d %H:%M").current())
  3. GetDate("2019-08-08").get_month_first_day() devuelve la fecha dada (cadena u objeto) mes primer día
  4. GetDate("2019-08-08").get_month_last_day() devuelve dado fecha mes último día
  5. GetDate("2019-08-08").minimum_time() devuelve la fecha dada de inicio del día
  6. GetDate("2019-08-08").maximum_time() devuelve la fecha de finalización del día
  7. GetDate("2019-08-08").time_delta_days({number_of_days})devuelve la fecha dada + agregue {número de días} (también puede llamar: GetDate(timezone.now()).time_delta_days(-1)para ayer)
  8. GetDate("2019-08-08").time_delta_haours({number_of_hours}) similar a pt 7 pero trabajando en horas
  9. GetDate("2019-08-08").time_delta_seconds({number_of_seconds}) similar a pt 7 pero trabajando en segundos
0

A veces necesitamos usar la búsqueda por fecha y fecha. Si lo usamos date__range, debemos agregar 1 día para que, de lo to_datecontrario, el conjunto de consultas esté vacío.

Ejemplo:

from datetime import timedelta  

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

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

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

Ya veo un ejemplo de pandas, pero aquí un giro donde puedes importar directamente la clase Day

from pandas.tseries.offsets import Day

date1 = datetime(2011, 10, 10)
date2 = date1 + 5 * Day()
0

Prueba esto:

Añadiendo 5 días a la fecha actual.

from datetime import datetime, timedelta

current_date = datetime.now()
end_date = current_date + timedelta(days=5) # Adding 5 days.
end_date_formatted = end_date.strftime('%Y-%m-%d')
print(end_date_formatted)

restando 5 días de la fecha actual.

from datetime import datetime, timedelta

current_date = datetime.now()
end_date = current_date + timedelta(days=-5) # Subtracting 5 days.
end_date_formatted = end_date.strftime('%Y-%m-%d')
print(end_date_formatted)
0
class myDate:

    def __init__(self):
        self.day = 0
        self.month = 0
        self.year = 0
        ## for checking valid days month and year
        while (True):
            d = int(input("Enter The day :- "))
            if (d > 31):
                print("Plz 1 To 30 value Enter ........")
            else:
                self.day = d
                break

        while (True):
            m = int(input("Enter The Month :- "))
            if (m > 13):
                print("Plz 1 To 12 value Enter ........")
            else:
                self.month = m
                break

        while (True):
            y = int(input("Enter The Year :- "))
            if (y > 9999 and y < 0000):
                print("Plz 0000 To 9999 value Enter ........")
            else:
                self.year = y
                break
    ## method for aday ands cnttract days
    def adayDays(self, n):
        ## aday days to date day
        nd = self.day + n
        print(nd)
        ## check days subtract from date
        if nd == 0: ## check if days are 7  subtracted from 7 then,........
            if(self.year % 4 == 0):
                if(self.month == 3):
                    self.day = 29
                    self.month -= 1
                    self.year = self. year
            else:
                if(self.month == 3):
                    self.day = 28
                    self.month -= 1
                    self.year = self. year
            if  (self.month == 5) or (self.month == 7) or (self.month == 8) or (self.month == 10) or (self.month == 12):
                self.day = 30
                self.month -= 1
                self.year = self. year
                   
            elif (self.month == 2) or (self.month == 4) or (self.month == 6) or (self.month == 9) or (self.month == 11):
                self.day = 31
                self.month -= 1
                self.year = self. year

            elif(self.month == 1):
                self.month = 12
                self.year -= 1    
        ## nd == 0 if condition over
        ## after subtract days to day io goes into negative then
        elif nd < 0 :   
            n = abs(n)## return positive if no is negative
            for i in range (n,0,-1): ## 
                
                if self.day == 0:

                    if self.month == 1:
                        self.day = 30
                        
                        self.month = 12
                        self.year -= 1
                    else:
                        self.month -= 1
                        if(self.month == 1) or (self.month == 3)or (self.month == 5) or (self.month == 7) or (self.month == 8) or (self.month == 10) or (self.month ==12):
                            self.day = 30
                        elif(self.month == 4)or (self.month == 6) or (self.month == 9) or (self.month == 11):
                            self.day = 29
                        elif(self.month == 2):
                            if(self.year % 4 == 0):
                                self.day == 28
                            else:
                                self.day == 27
                else:
                    self.day -= 1

        ## enf of elif negative days
        ## adaying days to DATE
        else:
            cnt = 0
            while (True):

                if self.month == 2:  # check leap year
                    
                    if(self.year % 4 == 0):
                        if(nd > 29):
                            cnt = nd - 29
                            nd = cnt
                            self.month += 1
                        else:
                            self.day = nd
                            break
                ## if not leap year then
                    else:  
                    
                        if(nd > 28):
                            cnt = nd - 28
                            nd = cnt
                            self.month += 1
                        else:
                            self.day = nd
                            break
                ## checking month other than february month
                elif(self.month == 1) or (self.month == 3) or (self.month == 5) or (self.month == 7) or (self.month == 8) or (self.month == 10) or (self.month == 12):
                    if(nd > 31):
                        cnt = nd - 31
                        nd = cnt

                        if(self.month == 12):
                            self.month = 1
                            self.year += 1
                        else:
                            self.month += 1
                    else:
                        self.day = nd
                        break

                elif(self.month == 4) or (self.month == 6) or (self.month == 9) or (self.month == 11):
                    if(nd > 30):
                        cnt = nd - 30
                        nd = cnt
                        self.month += 1

                    else:
                        self.day = nd
                        break
                ## end of month condition
        ## end of while loop
    ## end of else condition for adaying days
    def formatDate(self,frmt):

        if(frmt == 1):
            ff=str(self.day)+"-"+str(self.month)+"-"+str(self.year)
        elif(frmt == 2):
            ff=str(self.month)+"-"+str(self.day)+"-"+str(self.year)
        elif(frmt == 3):
            ff =str(self.year),"-",str(self.month),"-",str(self.day)
        elif(frmt == 0):
            print("Thanky You.....................")
            
        else:
            print("Enter Correct Choice.......")
        print(ff)
            
            

dt = myDate()
nday = int(input("Enter No. For Aday or SUBTRACT Days :: "))
dt.adayDays(nday)
print("1 : day-month-year")
print("2 : month-day-year")
print("3 : year-month-day")
print("0 : EXIT")
frmt = int (input("Enter Your Choice :: "))
dt.formatDate(frmt)
1
  • ¿Qué es este tipo? hace 2 días