Добавяне на дни към дата в 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
възможен дубликат на добавяне на дни към дата в Python с помощта на цикли, диапазони и нарязване   -  person S.Lott    schedule 29.07.2011
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
само искам да отбележа, че инсталирането на pandas само за това е сериозно прекаляване. - 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

Ето друг метод за добавяне на дни към дата с помощта на relativedelta на 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

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() - това ще преобразува вашия низ за дата в обект с часова зона с часова зона, която сте дефинирали в точка 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

Вече виждам пример за pandas, но ето един обрат към него, където можете директно да импортирате класа 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