Добавление 5 дней к дате в 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

19 ответов

Решение

Предыдущие ответы верны, но обычно это лучше делать:

import datetime

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

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

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

Импортировать timedelta первый.

from datetime import timedelta

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

EndDate = Date + timedelta(days=10)

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

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

Это может помочь импортировать timedelta.

from datetime import date, timedelta
date1 = date(2011, 10, 10)
date2 = date + timedelta(days=5)
print (date2)

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

from datetime import datetime
from datetime import timedelta


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

Вот еще один метод добавления дней в дату, используя относительную дельту 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')

Выход:

Сегодня: 25/06/2015 15:56:09

Через 5 дней: 30/06/2015 15:56:09

Я полагаю, вам не хватает чего-то такого:

from datetime import timedelta

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

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

Чтобы иметь менее подробный код и избежать конфликтов имен между 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 позже.

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

Добавление 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)

Я только что наткнулся на эту старую тему:

Я проверил, но большинство ответов одинаковы. Мне понравились два ответа из всех этих, поэтому я подумал проверить эффективность этих двух подходов.

Первый подход: использование модуля DateTime Второй подход: использование библиотеки панды

Поэтому я запускаю тест около 10 тысяч раз, и метод библиотеки pandas был намного медленнее. Поэтому я предлагаю использовать встроенный модуль DateTime.

      from datetime import date, timedelta
import pandas as pd
import timeit

def using_datetime():
    pre_date = date(2013, 10, 10)
    day_date = pre_date + timedelta(days=5)
    return day_date

def using_pd():
    start_date = "10/10/2022"
    pd_date = pd.to_datetime(start_date)
    end_date = pd_date + pd.DateOffset(days=5)
    return end_date
    

for func in [using_datetime, using_pd]:
    print(f"{func.__name__} Time Took: ",  timeit.timeit(stmt=func, number=10000))
    
# Output 
# using_datetime Time Took:  0.009390000021085143
# using_pd Time Took:  2.1051381999859586

Вы забыли импортироватьtimedeltaфункция отdatetime

Вот как вы можете это исправить:

      import re
from datetime import datetime, timedelta

StartDate = "10/10/11"

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

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

print(EndDate)

Это вывод приведенного выше кода:2012-08-03 23:13:53.485750

Вы можете использовать его таким образом, он будет работать:

Если вам нужна только дата, то:

      import datetime

StartDate = "10/10/11"
Date = datetime.datetime.strptime(StartDate, "%m/%d/%y").date()
print("Date: ", Date)

EndDate = Date + datetime.timedelta(days=10)
print("EndDate: ", EndDate)

Если вам нужна дата и время, то:

      import datetime

StartDate = "10/10/11"
Date = datetime.datetime.strptime(StartDate, "%m/%d/%y")
print("Date: ", Date)

EndDate = Date + datetime.timedelta(days=10)
print("EndDate: ", EndDate)

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

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

      from pandas.tseries.offsets import Day

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

С помощью 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

Иногда нам нужно использовать поиск по дате и по дате. Если мы используем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])

Это моя первоначальная, но более полная разработка для общей функции dateadd в python

import datetime
from dateutil.relativedelta import relativedelta

def dateadd(date, part ,value):

    if part=='year':
        result = date + (value * relativedelta(years = 1))
    elif part == 'month':
        result = date + (value * relativedelta(months = 1))
    elif part == 'day':
        result = date + (value * relativedelta(days = 1))
    elif part == 'hour':
        result = date + (value * relativedelta(hours = 1))
    elif part == 'minute':
        result = date + (value * relativedelta(minutes = 1))
    elif part == 'second':
        result = date + (value * relativedelta(seconds = 1))
    return result


date = datetime.datetime.now()
print(date, "now")
print(dateadd(date,'year',2)   ,"year',2", )
print(dateadd(date,'year',-2)  ,"year',-2", )
print(dateadd(date,'month',2)  ,"month',2", )
print(dateadd(date,'month',-2) ,"month',-2", )
print(dateadd(date,'day',2)    ,"day',2", )
print(dateadd(date,'day',-2)   ,"day',-2", )
print(dateadd(date,'hour',2)   ,"hour',2", )
print(dateadd(date,'hour',-2)  ,"hour',-2", )
print(dateadd(date,'minute',2) ,"minute',2", )
print(dateadd(date,'minute',-2),"minute',-2", )
print(dateadd(date,'second',2) ,"second',2", )
print(dateadd(date,'second',-2),"second',-2", )

Результат:
2018-03-08 09: 04: 12.619699 сейчас
2020-03-08 09: 04: 12.619699 год ', 2
2016-03-08 09: 04: 12.619699 год ', - 2
2018-05-08 09: 04: 12.619699 month ', 2
2018-01-08 09: 04: 12.619699 месяц ', - 2
2018-03-10 09: 04: 12.619699 день ', 2
2018-03-06 09: 04: 12.619699 день ', - 2
2018-03-08 11: 04: 12.619699 час ', 2
2018-03-08 07: 04: 12.619699 час ', - 2
2018-03-08 09: 06: 12.619699 минута, 2
2018-03-08 09: 02: 12.619699 минута, - 2
2018-03-08 09: 04: 14.619699 секунда, 2
2018-03-08 09: 04: 10.619699 секунда, - 2

      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)
Другие вопросы по тегам