我有一个字符串列表如下:
4:00-5:00PM
11:00-2:00PM
12:00-1:00PM
11:00-1:00AM
我试图找到一种有效的方法来创建两个时间对象(我想这是跟踪一段时间的唯一方法,我稍后将与日期对象结合)。人类很清楚我们在11:00-1:00 AM的意思,但想知道将其转换为有效方法是什么:
datetime.time(23, 0)
datetime.time(1, 0)
我目前的做法是第一次,创建PM和AM版本,使用结束时间(指定)的timedelta,并将两个差异中较短的差异作为正确的差异。
答案 0 :(得分:3)
这是一个简单的实现。
>>> def timeRange(timestr):
... t1, t2 = timestr.split("-")
... timeFormat = "%I:%M%p"
... t1AM = datetime.datetime.strptime(t1 + "AM", timeFormat)
... t1PM = datetime.datetime.strptime(t1 + "PM", timeFormat)
... t2 = datetime.datetime.strptime(t2, timeFormat)
...
... if (t2 - t1AM).seconds < (t2-t1PM).seconds:
... return t1AM.time(), t2.time()
... else:
... return t1PM.time(), t2.time()
>>> timeRange("11:00-2:00PM")
(datetime.time(11, 0), datetime.time(14, 0))
>>> timeRange("4:00-5:00PM")
(datetime.time(16, 0), datetime.time(17, 0))
>>> timeRange("11:00-1:00AM")
(datetime.time(23, 0), datetime.time(1, 0))
>>> timeRange("11:00-2:00PM")
(datetime.time(11, 0), datetime.time(14, 0))
>>> timeRange("12:00-1:00PM")
(datetime.time(12, 0), datetime.time(13, 0))
这会返回一个time
对象,但如果需要,可以将其转换为日期时间对象。
答案 1 :(得分:2)
您的问题隐含了两个假设:
如果这些假设属实,那么快速优化将是:
即使是最长的时间段也是如此,例如6:00-6:00AM(6:00 PM-6:00AM比上午6:00 AM-6:00 AM更短)
第二个观察是你不能使用简单的时间对象,因为
因此我认为你必须使用datetime,或者将所有这些包装在一个结构中,该结构说明第一次对象是前一天的时间。
希望这会有所帮助:)