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


368

У меня есть свидание, "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

12
Общая подсказка: если вы получаете ошибку name 'timedelta' is not defined, это означает, что вы timedeltaнигде не определились . Python обычно довольно информативен о своих сообщениях об ошибках.
Катриэль

1
Поиск не сработал? Все эти примеры кода помогли бы: stackoverflow.com/search?q=python+timedelta . Там, кажется, более 200 вопросов, как этот.
С.Лотт


9
Вы хотите добавить пять дней, но тогда у вас есть timedelta (days = 10) ... Я не понимаю, откуда
взялись

Ответы:


558

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

import datetime

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

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

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

7
datetime.datetime - почему дважды?
paulmorriss

59
импортирование как «из datetime import datetime, timedelta» добавило бы читабельности к коду
Манель Клос

8
@paulmorriss: Вы вызываете strptimeметод datetimeкласса в datetimeмодуле, поэтому вам нужно указать datetime.datetime.
Грэм Перроу,

6
Можем ли мы все согласиться с тем, что называть обычно используемый класс тем же именем, что и модуль, содержащий его, - глупая идея? Что такое datetime? Вы не можете полагаться на соглашение, чтобы знать, но всегда должны смотреть на импорт.
Сюн Чямов

8
Длинный хвост унаследовал проблему. это "должно" быть, from datetime import DateTimeтак как классы имеют CamelCased, но datetime предшествует PEP8.
Аарон Макмиллин

120

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

from datetime import timedelta, date

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

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

11
datetime.date.today () вместо Date.today ()
elsadek

2
@ Dan-Klasson Это не работает для меня, у dateобъекта нет timedeltaметода. Какую версию Python вы используете?
DrTyrsa

@DrTyrsa Мой плохой. Должно быть:from datetime import timedelta, date; date.today() + timedelta(days=10)
Дан-классон

21

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

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

Работал нормально для меня. Спасибо
Ренни

12

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

from datetime import timedelta

12

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


10

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

from datetime import datetime
from datetime import timedelta


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

9

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

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

1
Хороший код Но ваш IF для тестирования addDays в get_date не нужен
Eduardo

6

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


0

используя 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

0

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

0

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

Пример:

из даты и времени импорта

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.