Python从字符串中获取日期。

4
我有一个具有非静态日期结构的数据集,例如:
Fri, 13 Apr 2018 13:13:12 +0000 (UTC)
Mon, 26 Mar 2018 06:32:59 +0100
Tue, 05 Dec 2017 11:03:34 GMT
08 Dec 2016 12:00:24

如何使用正则表达式自动获取字符串中的日期、(小时+offset)和分钟。

1
你想要的输出格式是什么?你如何区分手动代码和正则表达式? - DirtyBit
我只想提取并转换为分类(用于机器学习)@user5173426 - Baltschun Ali
请查看strptime文档这个问题。在您的情况下,您可能需要实现额外的回退策略来在不同的格式类型之间切换(例如for format in formats + try ... except中的strptime)。 - mfrackowiak
1个回答

11

使用 timestring

import timestring

dt_1 = "Fri, 13 Apr 2018 13:13:12 +0000 (UTC)"
dt_2 = "Mon, 26 Mar 2018 06:32:59 +0100"
dt_3 = "Tue, 05 Dec 2017 11:03:34 GMT"
dt_4 = "08 Dec 2016 12:00:24"

print(timestring.Date(dt_1))
print(timestring.Date(dt_2))
print(timestring.Date(dt_3))
print(timestring.Date(dt_4))

编辑:

趁机提一下,这里有另一种更酷的方法:

使用dparser:

import dateutil.parser as dparser

dt_1 = "Fri, 13 Apr 2018 13:13:12 +0000 (UTC)"
dt_2 = "Mon, 26 Mar 2018 06:32:59 +0100"
dt_3 = "Tue, 05 Dec 2017 11:03:34 GMT"
dt_4 = "08 Dec 2016 12:00:24"


print(dparser.parse(dt_1,fuzzy=True))
print(dparser.parse(dt_2,fuzzy=True))
print(dparser.parse(dt_3,fuzzy=True))
print(dparser.parse(dt_4,fuzzy=True))

输出:

2018-04-13 13:13:12+00:00
2018-03-26 06:32:59+01:00
2017-12-05 11:03:34+00:00
2016-12-08 12:00:24

编辑2:

dparser 为什么更酷?

无效的日期会引发 ValueError 异常:

invalid_dt = "Fri, 35 Apr 2018 13:13:12 +0000 (UTC)"
print(dparser.parse(invalid_dt,fuzzy=True))

输出:

ValueError: day is out of range for month

编辑3:

获取day(日)、month(月)、year(年)、hour(小时)、minute(分钟)或 second(秒):

print(dparser.parse(dt_1,fuzzy=True).day)     # 13
print(dparser.parse(dt_2,fuzzy=True).month)   # 3
print(dparser.parse(dt_3,fuzzy=True).year)    # 2017
print(dparser.parse(dt_4,fuzzy=True).hour)    # 12
print(dparser.parse(dt_4,fuzzy=True).minute)  # 0
print(dparser.parse(dt_4,fuzzy=True).second)  # 24

编辑4:

如果您想获取日期的名称:

print(datetime.date(dparser.parse(dt_1,fuzzy=True)).strftime("%a"))  # Fri

看起来输出结果不正确。例如:Fri 13 Apr 的输出应该是2019-02-15。 - Florian Toqué
谢谢帮助,返回了一个好的字符串。有关day的任何想法吗? - Baltschun Ali
@BaltschunAli 当然可以,只需使用 day 属性。例如 > print(dparser.parse(dt_1,fuzzy=True).day) 返回 13 - DirtyBit
抱歉,我是指像“mon”、“fri”等这样的内容。 - Baltschun Ali
当然,你可以使用 print(datetime.date(dparser.parse(dt_1,fuzzy=True)).strftime("%A")) 返回 Friday 或者如果你想要 Fri,可以使用 %a - DirtyBit
显示剩余3条评论

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