Додавання 5 днів до дати в Python


366

У мене є дата, "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 питань.
S.Lott


9
Ви хочете додати п’ять днів, але тоді у вас є timedelta (днів = 10)… Мене бентежить питання, звідки прийшла 10 та чому її не 5
FeifanZ

Відповіді:


556

Попередні відповіді правильні, але це, як правило, краще:

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
імпорт на кшталт "from datetime import datetime, timedelta" додасть читальності коду
Manel Clos

8
@paulmorriss: Ви викликаєте strptimeметод на datetimeкласі в datetimeмодулі, тому вам потрібно вказати datetime.datetime.
Graeme Perrow

6
Чи можемо ми всі погодитись, що називати загальновживаний клас тим самим іменем, що і модуль, що містить його, є дурною ідеєю? Що таке datetime? Ви не можете покладатися на конвенцію, щоб знати, але завжди потрібно дивитися на імпорт.
Xiong Chiamiov

8
Проблема з довгим хвостом є. це "повинно" бути, from datetime import DateTimeоскільки заняття є CamelCased, але дата передує 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)
dan-klasson

21

Якщо ви вже використовуєте панди , ви можете заощадити трохи місця, не вказуючи формат:

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

Для мене добре працювали. Спасибі
renny

12

Я думаю, вам щось таке не вистачає:

from datetime import timedelta

12

Ось ще один метод додавання днів у дату, використовуючи відносну дельта дати .

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
Хороший код. Але ваш ІФ для перевірки добавок у get_date не потрібен
Едуардо

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()- це перетворить вашу дату рядка в об'єкт, відомий за часом, з часовим поясом, визначеним у 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, але працює на секунди

0

Деякий час нам потрібно використовувати пошук за датою та датою. Якщо ми використовуємо date__range, нам потрібно додати 1 день з to_date, інакше набір запитів буде порожнім.

Приклад:

з імпортування таймедели від datetime

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

to_date = parse_date (request.POST ['to_date']) + timedelta (днів = 1)

відвідуваність_list = models.DailyAttendance.objects.filter (attdate__range = [з_дати, до_дачі])

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.