2015-02-01 4 views
3

Добрый вечер,Как найти дату n дней назад в Python?

Я хотел бы написать сценарий, в котором я даю python несколько дней (давайте называть его 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" 

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

+0

Что 'предполагается h' быть? – khelwood

+0

Возможный дубликат [Как я могу вычесть день из даты python?] (Http://stackoverflow.com/questions/441147/how-can-i-subtract-a-day-from-a-python-date) – jfs

ответ

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 
+0

@ Dirty_Fox мы все были там;) –

+0

@Dirty_Fox: это немного сложнее, если принять во внимание часовые пояса (смещение utc может отличаться на разные даты). См. Дублированный вопрос – jfs

0

Если ваши аргументы - это что-то вроде вчера, 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') 
Смежные вопросы