python'x days ago'到datetime

app*_*ief 12 python datetime

我有以下列格式显示日期的字符串:

x minutes/hours/days/months/years ago
Run Code Online (Sandbox Code Playgroud)

我需要使用python将其解析为日期时间.

似乎dateutil无法做到这一点.

有办法吗?

You*_*cef 13

最简单的方法是使用dateparser

import dateparser
date_ago = '4 months ago'
date     = dateparser.parse(date_ago)
date     = date.strftime("%Y-%m-%d")
Run Code Online (Sandbox Code Playgroud)

输出:

'2020-01-08'
Run Code Online (Sandbox Code Playgroud)

您可能需要安装dateparserpip 包

pip install dateparser
Run Code Online (Sandbox Code Playgroud)


mgi*_*son 9

当然你可以做到.你只需要一个timedelta.

s = "3 days ago"
parsed_s = [s.split()[:2]]
time_dict = dict((fmt,float(amount)) for amount,fmt in parsed_s)
dt = datetime.timedelta(**time_dict)
past_time = datetime.datetime.now() - dt
Run Code Online (Sandbox Code Playgroud)

顺便说一句,看起来它dateutil有一个relativedelta像timedelta一样的行为,但是构造函数也接受months并且years在参数中(显然参数需要是整数).


Sim*_*nde 9

因为你的论点大约是两天前、三个月前、两年前。下面的函数可能有助于获取参数的确切日期。您首先需要导入以下日期实用程序

import datetime
from dateutil.relativedelta import relativedelta
Run Code Online (Sandbox Code Playgroud)

然后实现下面的功能

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"
Run Code Online (Sandbox Code Playgroud)

然后您可以像这样调用该函数:

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')
Run Code Online (Sandbox Code Playgroud)


Gar*_*tty 6

这可以通过timedeltas 轻松完成:

import datetime

def string_to_delta(string_delta):
    value, unit, _ = string_delta.split()
    return datetime.timedelta(**{unit: float(value)})
Run Code Online (Sandbox Code Playgroud)

生产:

>>> string_to_delta("20 hours ago")
datetime.timedelta(0, 72000)
Run Code Online (Sandbox Code Playgroud)

尽管这将需要一些额外的工作来处理月/年 - 为增加一个月的日期是一个模糊的操作,但它应该是一个简单的加法,如果你知道你希望它是什么意思.

要获得实际时间,只需将delta带离datetime.datetime.now().