Как найти дату n дней назад в Python?

Добрый вечер, парни,

Я хотел бы написать скрипт, в котором я даю python количество дней (давайте назовем это d), и он дает мне дату, которую мы имели d дней назад.

Я борюсь с модулем datetime:

import datetime 

tod = datetime.datetime.now()
d = timedelta(days = 50) 
a = tod - h 
Type Error : unsupported operand type for - : "datetime.timedelta" and 
"datetime.datetime" 

Спасибо за вашу помощь

5 ответов

Вы что-то перепутали со своими переменными, вы можете вычесть timedelta d от datetime.datetime.now() без проблем:

import datetime 
tod = datetime.datetime.now()
d = datetime.timedelta(days = 50)
a = tod - d
print(a)
2014-12-13 22:45:01.743172

Ниже код должен работать

from datetime import datetime, timedelta

N_DAYS_AGO = 5

today = datetime.now()    
n_days_ago = today - timedelta(days=N_DAYS_AGO)
print today, n_days_ago

Если ваши аргументы примерно такие, вчера,2 дня назад, 3 месяца назад,2 года назад. Функция ниже может помочь в получении точной даты для аргументов. Сначала вам нужно импортировать следующую дату утилиты

import datetime
from dateutil.relativedelta import relativedelta

Затем реализуйте функцию ниже

def get_past_date(str_days_ago):
    TODAY = datetime.date.today()
    splitted = str_days_ago.split()
    if len(splitted) == 1 and splitted[0].lower() == 'today':
        return str(TODAY.isoformat())
    elif len(splitted) == 1 and splitted[0].lower() == 'yesterday':
        date = TODAY - relativedelta(days=1)
        return str(date.isoformat())
    elif splitted[1].lower() in ['hour', 'hours', 'hr', 'hrs', 'h']:
        date = datetime.datetime.now() - relativedelta(hours=int(splitted[0]))
        return str(date.date().isoformat())
    elif splitted[1].lower() in ['day', 'days', 'd']:
        date = TODAY - relativedelta(days=int(splitted[0]))
        return str(date.isoformat())
    elif splitted[1].lower() in ['wk', 'wks', 'week', 'weeks', 'w']:
        date = TODAY - relativedelta(weeks=int(splitted[0]))
        return str(date.isoformat())
    elif splitted[1].lower() in ['mon', 'mons', 'month', 'months', 'm']:
        date = TODAY - relativedelta(months=int(splitted[0]))
        return str(date.isoformat())
    elif splitted[1].lower() in ['yrs', 'yr', 'years', 'year', 'y']:
        date = TODAY - relativedelta(years=int(splitted[0]))
        return str(date.isoformat())
    else:
        return "Wrong Argument format"

Затем вы можете вызвать функцию следующим образом:

print get_past_date('5 hours ago')
print get_past_date('yesterday')
print get_past_date('3 days ago')
print get_past_date('4 months ago')
print get_past_date('2 years ago')
print get_past_date('today')

мы можем получить то же самое, что и это, это также применимо к прошлым и будущим датам.

Текущая дата:

      import datetime
Current_Date = datetime.datetime.today()
print (Current_Date)

Предыдущая дата:

      import datetime
Previous_Date = datetime.datetime.today() - datetime.timedelta(days=1) #n=1
print (Previous_Date)

Дата следующего дня:

      import datetime
NextDay_Date = datetime.datetime.today() + datetime.timedelta(days=1)
print (NextDay_Date)

Для приложений, в которых вы хотите предоставить пользователю удобный формат ввода относительных дат, вы можете посмотреть парсер из пакета Python dateparser.Это решение похоже на предложенное Симеоном Бабатунде , но более функциональное. Использование таково:

      from dateparser import parse

date_time = parse('10 days ago')
``
Другие вопросы по тегам