如何将自然语言中的日期和时间转换为datetime格式?

36

我正在寻找一种方法将“明天上午6点”或“下周一中午12点”翻译成相应的日期时间对象。

我考虑过制定一个复杂的规则集,但是否有其他方法?


命令date可以在Linux上接受一些可读日期,例如:date --date='下周一上午8:30' - Flimm
2个回答

53

parsedatetime - 一个Python模块,能够解析“人类可读”的日期/时间表达式。

#!/usr/bin/env python
from datetime import datetime
import parsedatetime as pdt # $ pip install parsedatetime

cal = pdt.Calendar()
now = datetime.now()
print("now: %s" % now)
for time_string in ["tomorrow at 6am", "next moday at noon", 
                    "2 min ago", "3 weeks ago", "1 month ago"]:
   print("%s:\t%s" % (time_string, cal.parseDT(time_string, now)[0]))

输出

now: 2015-10-18 13:55:29.732131
tomorrow at 6am:    2015-10-19 06:00:00
next moday at noon: 2015-10-18 12:00:00
2 min ago:  2015-10-18 13:53:29
3 weeks ago:    2015-09-27 13:55:29
1 month ago:    2015-09-18 13:55:29

确实,这是一个很棒的库。编码示例+已记录的错误可在此处找到(http://stackoverflow.com/a/30224711/605356) - 显然需要解决一些问题,以适应parsedatetime版本1.4。 - Johnny Utahh
1
“moday”是一个错误还是故意拼错的? - Meet Taraviya
@MeetTaraviya - 问一下那个在6年后编辑了我的答案的人 :P - Alex Barrett
我在使用pip安装了parsedatetime模块后,仍然显示No module named 'parsedatetime' - Cyzanfar
当我遇到和 @Cyzanfar 一样的错误提示时,我通过将脚本的第一行更改为 #!/usr/bin/env python3 来解决了这个问题。 - NSSynapse

11

看看你对这个例子的看法。它处理以下测试案例:

today
tomorrow
yesterday
in a couple of days
a couple of days from now
a couple of days from today
in a day
3 days ago
3 days from now
a day ago
now
10 minutes ago
10 minutes from now
in 10 minutes
in a minute
in a couple of minutes
20 seconds ago
in 30 seconds
20 seconds before noon
20 seconds before noon tomorrow
noon
midnight
noon tomorrow
6am tomorrow
0800 yesterday
12:15 AM today
3pm 2 days from today
a week from today
a week from now
3 weeks ago
noon next Sunday
noon Sunday
noon last Sunday

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接