我有以下列格式显示日期的字符串:
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)
当然你可以做到.你只需要一个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在参数中(显然参数需要是整数).
因为你的论点大约是两天前、三个月前、两年前。下面的函数可能有助于获取参数的确切日期。您首先需要导入以下日期实用程序
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)
这可以通过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().