Agregar 5 días a una fecha en Python


367

Tengo una fecha "10/10/11(m-d-y)"y quiero agregarle 5 días usando un script Python. Considere también una solución general que funcione en los 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)

Lo que devolvió este error:

name 'timedelta' is not defined

12
Pista general: si obtienes el error name 'timedelta' is not defined, eso significa que no has definido nada timedelta. Python suele ser bastante informativo sobre sus mensajes de error.
Katriel

1
¿La búsqueda no funcionó? Todos estos ejemplos de código habrían ayudado: stackoverflow.com/search?q=python+timedelta . Parece que hay más de 200 preguntas como esta.
S.Lott


99
Desea agregar cinco días, pero luego tiene timedelta (días = 10) ... Estoy confundido acerca de dónde vino el 10 y por qué no es 5
FeifanZ

Respuestas:


557

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)

77
datetime.datetime: ¿por qué dos veces?
Paulmorriss

59
la importación como "desde datetime import datetime, timedelta" agregaría legibilidad al código
Manel Clos

8
@paulmorriss: está llamando al strptimemétodo en la datetimeclase en el datetimemódulo, por lo que debe especificarlo datetime.datetime.
Graeme Perrow

66
¿Podemos todos estar 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 puede confiar en la convención para saberlo, pero siempre tiene que mirar las importaciones.
Xiong Chiamiov

8
Problema de legado de cola larga allí "debería" ser from datetime import DateTimeporque las clases son CamelCased, pero datetime precede a PEP8.
Aaron McMillin

120

Importar timedeltay dateprimero.

from datetime import timedelta, date

Y date.today()volverá la fecha y hora de hoy, puede ser que quieras

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

11
datetime.date.today () en lugar de Date.today ()
elsadek

2
@ dan-klasson No funciona para mí, el dateobjeto no tiene timedeltamétodo. ¿Qué versión de Python estás usando?
DrTyrsa

@DrTyrsa My bad. Debería ser:from datetime import timedelta, date; date.today() + timedelta(days=10)
dan-klasson

21

Si ya estás usando pandas , puedes 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)

Funcionó bien para mí. Gracias
renny

12

Supongo que te estás perdiendo algo así:

from datetime import timedelta

12

Aquí hay otro método para agregar días en la fecha usando la relación relativa 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')

Salida:

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

Después de 5 días: 30/06/2015 15:56:09


10

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')

9

Aquí está la función de obtener desde ahora + días específicos

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
Buen código Pero su IF para probar addDays en get_date no es necesario
Eduardo

6

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 puede 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 conflicto de nombres si lo desea import datetimemás adelante.


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 mis 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 usar en el proyecto
  2. GetDate("2019-08-08").current()- esto convertirá la fecha de su cadena en un objeto con reconocimiento de tiempo con la zona horaria que definió en el punto 1. El formato de cadena predeterminado es format="%Y-%m-%d"pero no dude en cambiarlo. (ej. GetDate("2019-08-08 08:45", format="%Y-%m-%d %H:%M").current())
  3. GetDate("2019-08-08").get_month_first_day() devuelve fecha dada (cadena u objeto) mes primer día
  4. GetDate("2019-08-08").get_month_last_day() devuelve fecha dada mes último día
  5. GetDate("2019-08-08").minimum_time() devuelve fecha dada inicio del día
  6. GetDate("2019-08-08").maximum_time() devuelve fecha dada fin de día
  7. GetDate("2019-08-08").time_delta_days({number_of_days})devuelve la fecha dada + agregar {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 al pt 7 pero trabajando en horas
  9. GetDate("2019-08-08").time_delta_seconds({number_of_seconds}) similar al pt 7 pero trabajando en segundos

0

En algún momento necesitamos usar la búsqueda por fecha y fecha. Si usamos date__range, entonces debemos agregar 1 días con to_date, de lo contrario el conjunto de consultas se vaciará.

Ejemplo:

desde datetime import timedelta

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

to_date = parse_date (request.POST ['to_date']) + timedelta (días = 1)

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.