【问题标题】:Strings with start and end time to datetime具有日期时间的开始和结束时间的字符串
【发布时间】:2015-02-16 17:14:04
【问题描述】:

对于一个项目,我需要解析一些日期字符串。给出了一个日期,即一周中的星期一,例如: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)
    })

如您所见,这只会成功设置日期,而不是小时/分钟。有没有办法轻松实现这一点?

【问题讨论】:

    标签: python date datetime python-datetime


    【解决方案1】:

    您也可以使用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)
    

    【讨论】:

    • 太棒了,谢谢你的详细解释!它完美无缺。
    【解决方案2】:

    不确定您所处的具体情况,但您可以尝试酷炫的 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 的方法可能更安全。

    【讨论】:

    • 这看起来也很有前途!感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 2020-03-21
    相关资源
    最近更新 更多