开始和结束时间到日期时间的字符串

Strings with start and end time to datetime

对于一个项目,我需要解析一些日期字符串。给定一个日期,是一周中的星期一,例如:2015年2月16日。

然后,我设法提取了一个日期列表,如下所示:

['Wednesday', '11:00AM', '7:00PM']  
['Friday', '10:15AM', '4:30PM']  
['Sunday', '12:00AM', '5:00PM']

第一个值显然是日期,第二个值是开始时间,最后一个值是结束时间(用于事件)。

我想将其转换为实际的 python datetime 对象,但它必须与开始日期一致。

到目前为止我尝试过的是使用这个:

# Beginning of week
BoW = datetime.strptime('Feb 16, 2015', "%b %d, %Y")

# List of days
for day in days:
    # Find the Day of the Week
    # This outputs a number, 0 = Monday, 6 = Sunday
    DoW = table.index(tr)

    schedule.append({
        'start' : BoW + timedelta(days=DoW),
        'end' : BoW + timedelta(days=DoW)
    })

如您所见,这只会成功设置日期,而不是 hour/minute。有什么方法可以轻松实现吗?

你也可以用strptime()解析时间:

timevalue = datetime.strptime(timecomponent, '%I:%M%p').time()

%I 是 12 小时制小时值(因此介于 1 和 12 之间),%p 是 AM 或 PM 限定符。

然后您可以使用 datetime.datetime.combine() 将该时间部分与您的日期结合起来:

BoW = datetime.strptime('Feb 16, 2015', "%b %d, %Y").date()
start = datetime.strptime(start_time, '%I:%M%p').time()
end = datetime.strptime(end_time, '%I:%M%p').time()
start, end = datetime.combine(BoW, start), datetime.combine(BoW, end)

演示:

>>> from datetime import datetime, timedelta
>>> BoW = datetime.strptime('Feb 16, 2015', "%b %d, %Y").date()
>>> datetime.strptime('11:00AM', '%I:%M%p').time()
datetime.time(11, 0)
>>> datetime.combine(BoW, _)
datetime.datetime(2015, 2, 16, 11, 0)

不确定你的情况到底是什么类型,但你可以试试很酷的 NLP 时间解析库 parsedatetime。它会让你做这样的事情:

import parsedatetime

cal = parsedatetime.Calendar()
WoY_timetuple, status = cal.parse("Feb 16, 2015")
DoW_timetuple, status = cal.parse("Wednesday", sourceTime=WoY_timetuple)
start, status = cal.parseDT("11:00AM", sourceTime=DoW_timetuple)
end, status = cal.parseDT("7:00PM", sourceTime=DoW_timetuple)

因此您可以轻松设置解析上下文,将一天中的每个时间字符串放入完整的 datetime 对象中。您需要确保仔细处理 .parse 方法返回的状态代码。如果您的输入数据在日期格式方面有一些可变性,这种方法可以节省时间,否则 Martijn 的方法可能更安全。