Добавление дней к дате в Python

У меня есть дата "10/10/11(m-d-y)", и я хочу добавить к ней 5 дней с помощью скрипта Python. Пожалуйста, подумайте об общем решении, которое работает и в конце месяца.

Я использую следующий код:

import re
from datetime import datetime

StartDate = "10/10/11"

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

print Date -> печатает '2011-10-10 00:00:00'

Теперь я хочу добавить к этой дате 5 дней. Я использовал следующий код:

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

Что вернуло эту ошибку:

name 'timedelta' is not defined

person MuraliKrishna    schedule 29.07.2011    source источник
comment
Общая подсказка: если вы получили сообщение об ошибке name 'timedelta' is not defined, это означает, что вы нигде не определили timedelta. Python обычно довольно информативен в своих сообщениях об ошибках.   -  person Katriel    schedule 29.07.2011
comment
Поиск не сработал? Помогли бы все эти примеры кода: stackoverflow.com/search?q=python+timedelta. Похоже, что таких вопросов более 200.   -  person S.Lott    schedule 29.07.2011
comment
comment
Вы хотите добавить пять дней, но тогда у вас есть timedelta (days = 10) ... Я не понимаю, откуда взялось 10 и почему это не 5   -  person FeifanZ    schedule 07.01.2013


Ответы (14)


Предыдущие ответы верны, но, как правило, лучше:

import datetime

Тогда у вас будет, используя datetime.timedelta:

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

end_date = date_1 + datetime.timedelta(days=10)
person Botond Béres    schedule 29.07.2011
comment
datetime.datetime - почему дважды? - person paulmorriss; 11.08.2014
comment
импорт, как из datetime import datetime, timedelta добавит читаемости коду - person Manel Clos; 12.11.2014
comment
@paulmorriss: вы вызываете метод strptime в классе datetime в модуле datetime, поэтому вам нужно указать datetime.datetime. - person Graeme Perrow; 07.01.2015
comment
Если явное лучше, вам следует избегать его сокращения. Но, согласитесь с from datetime import datetime, timedelta, это немного ясно и вообще удалило повторяющиеся слова. - person m3nda; 29.02.2016
comment
Разве это не должно быть %m/%d/%Y, а не %m/%d/%y? - person Kevin Vasko; 28.02.2017
comment
Можем ли мы все согласиться с тем, что называть часто используемый класс тем же именем, что и модуль, содержащий его, - глупая идея? Что такое datetime? Вы не можете полагаться на условности, чтобы знать, но всегда должны смотреть на импорт. - person Xiong Chiamiov; 05.06.2017
comment
Проблема с длинным хвостом есть. он должен быть from datetime import DateTime, поскольку классы имеют CamelCased, но datetime предшествует PEP8. - person Aaron McMillin; 26.06.2017
comment
Вы также можете сделать from datetime import datetime as DateTime, timedelta as TimeDelta, так что вы пришли к случаю и все же импортируете модуль import datetime, избегая конфликта имен. - person toto_tico; 27.09.2017
comment
В python3 мне нужно делать from datetime import datetime, timedelta и end_date = date_1 + timedelta(days=2) - person LaTechneuse; 29.01.2018

Сначала импортируйте timedelta и date.

from datetime import timedelta, date

И date.today() вернет сегодняшнюю дату и время, может быть, вы захотите

EndDate = date.today() + timedelta(days=10)
person DrTyrsa    schedule 29.07.2011
comment
datetime.date.today () вместо Date.today () - person elsadek; 06.08.2014
comment
@ dan-klasson У меня не работает, date объект не имеет timedelta метода. Какую версию Python вы используете? - person DrTyrsa; 17.07.2017
comment
@DrTyrsa Моя плохая. Должно быть: from datetime import timedelta, date; date.today() + timedelta(days=10) - person dan-klasson; 17.07.2017
comment
Я использую Python 3.7. Работал у меня. Большое спасибо. - person Geshan Ravindu; 26.06.2021

Если вы уже используете pandas, вы можете сэкономить немного места, не указав формат:

import pandas as pd
startdate = "10/10/2011"
enddate = pd.to_datetime(startdate) + pd.DateOffset(days=5)
person fantabolous    schedule 29.08.2014
comment
У меня сработало нормально. Спасибо - person renny; 30.04.2019
comment
Спасибо, сработало у меня - person siraj; 24.03.2021
comment
просто хочу отметить, что установка панд только для этого - это серьезный перебор. - person Christopher Hunter; 30.03.2021

Если вы хотите добавить дни на сегодняшний день, вы можете использовать этот код

from datetime import datetime
from datetime import timedelta


date_now_more_5_days = (datetime.now() + timedelta(days=5) ).strftime('%Y-%m-%d')
person Jorge Omar MH    schedule 20.02.2018

Вот еще один метод добавления дней к дате с помощью dateutil's relativedelta.

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

Выход:

Сегодня: 25.06.2015 15:56:09

Через 5 дней: 30.06.2015 15:56:09

person Atul Arvind    schedule 25.06.2015
comment
relativedelta особенно полезен при выполнении операций по месяцам, годам и т. д. - person forkadam; 20.08.2020

Я думаю, вам не хватает чего-то вроде этого:

from datetime import timedelta
person vstm    schedule 29.07.2011

Вот функция получения с этого момента + указанные дни

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)

Использование:

addDays = 3 #days
output_format = '%d-%m-%Y'
output = get_date(output_format, addDays)
print output
person Guray Celik    schedule 14.11.2014
comment
Хороший код. Но ваш IF для проверки addDays в get_date не нужен - person Eduardo; 24.11.2014

Чтобы иметь менее подробный код и избежать конфликтов имен между datetime и datetime.datetime, вам следует переименовать классы с помощью CamelCase имена.

from datetime import datetime as DateTime, timedelta as TimeDelta

Итак, вы можете сделать следующее, что, на мой взгляд, более понятно.

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

Кроме того, не будет конфликта имен, если вы захотите import datetime позже.

person toto_tico    schedule 27.09.2017

Это может помочь:

from datetime import date, timedelta
date1 = date(2011, 10, 10)
date2 = date1 + timedelta(days=5)
print (date2)
person Pradeep Subash    schedule 01.10.2020
comment
небольшая опечатка, в третьей строке должно быть date2 = date1 + timedelta (days = 5) - person Vyshak Puthusseri; 07.04.2021

используя timedeltas, вы можете:

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
person sameer_nubia    schedule 29.05.2019

Обычно у вас есть ответ, но, возможно, мой класс, который я создал, также будет вам полезен. Для меня он решает все мои требования, которые когда-либо возникали в моих проектах 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)

Как это использовать

  1. self.tz = pytz.timezone("Europe/Warsaw") - здесь вы определяете часовой пояс, который хотите использовать в проекте
  2. GetDate("2019-08-08").current() - это преобразует вашу строковую дату в объект с учетом времени с часовым поясом, который вы определили в pt 1. Формат строки по умолчанию - format="%Y-%m-%d", но вы можете его изменить. (например, GetDate("2019-08-08 08:45", format="%Y-%m-%d %H:%M").current())
  3. GetDate("2019-08-08").get_month_first_day() возвращает заданную дату (строку или объект) месяц первый день
  4. GetDate("2019-08-08").get_month_last_day() возвращает дату, месяц, последний день
  5. GetDate("2019-08-08").minimum_time() возвращает дату начала дня
  6. GetDate("2019-08-08").maximum_time() возвращает заданную дату конец дня
  7. GetDate("2019-08-08").time_delta_days({number_of_days}) возвращает заданную дату + добавляет {количество дней} (вы также можете позвонить: GetDate(timezone.now()).time_delta_days(-1) за вчерашний день)
  8. GetDate("2019-08-08").time_delta_haours({number_of_hours}) аналогично п. 7, но работает по часам
  9. GetDate("2019-08-08").time_delta_seconds({number_of_seconds}) аналогично пункту 7, но работает по секундам
person Michael Stachura    schedule 23.08.2019

Иногда нам нужно использовать поиск по дате и по дате. Если мы используем date__range, нам нужно добавить 1 день к to_date, иначе набор запросов будет пуст.

Пример:

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])
person jahurul25    schedule 28.10.2019

Я уже видел пример панд, но вот его поворот, где вы можете напрямую импортировать класс Day

from pandas.tseries.offsets import Day

date1 = datetime(2011, 10, 10)
date2 = date1 + 5 * Day()
person bvmcode    schedule 19.03.2021

Попробуй это:

Добавление 5 дней к текущей дате.

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)

вычитая 5 дней из текущей даты.

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)
person Amar Kumar    schedule 22.03.2021