Python:将不明确的小时数转换为时间对象的有效方法?
我有一个字符串列表,如下所示:Python:将不明确的小时数转换为时间对象的有效方法?,python,datetime,Python,Datetime,我有一个字符串列表,如下所示: 4:00-5:00PM 11:00-2:00PM 12:00-1:00PM 11:00-1:00AM 我试图找到一种有效的方法来创建两个时间对象(我想这是跟踪时间范围的唯一方法,稍后我会将其与日期对象结合起来)。人类很清楚我们说的11:00-1:00是什么意思,但想知道什么是将其转换为: datetime.time(23, 0) datetime.time(1, 0) 我目前的方法是采用第一个时间,创建PM和AM版本,采用时间增量和结束时间(指定),并采用两个
4:00-5:00PM
11:00-2:00PM
12:00-1:00PM
11:00-1:00AM
我试图找到一种有效的方法来创建两个时间对象(我想这是跟踪时间范围的唯一方法,稍后我会将其与日期对象结合起来)。人类很清楚我们说的11:00-1:00是什么意思,但想知道什么是将其转换为:
datetime.time(23, 0)
datetime.time(1, 0)
我目前的方法是采用第一个时间,创建PM和AM版本,采用时间增量和结束时间(指定),并采用两个差异中的较短者作为正确的一个 你的问题中隐含着两个假设:
- 您正在寻找这些时间之间最短的持续时间
- 第一次是两次中较早的一次
- 如果第一个时间大于第二个时间(如11:00-1:00AM或11:00-1:00PM),则较早的时间是第二个时间的“相反”AM/PM指示器。否则,第一次的AM/PM相同
- AM->PM持续时间发生在一天的边界(午夜)。在这种情况下,这可能会破坏时间增量的计算李>
希望这有帮助:)这里是一个简单的实现
>>> 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))
def时间范围(timestr):
... t1,t2=timestr.split(“-”)
... timeFormat=“%I:%M%p”
... t1AM=datetime.datetime.strtime(t1+“AM”,timeFormat)
... t1PM=datetime.datetime.strtime(t1+“PM”,timeFormat)
... t2=datetime.datetime.strtime(t2,timeFormat)
...
... 如果(t2-t1AM)。秒<(t2-t1PM)。秒:
... 返回t1AM.time(),t2.time()
... 其他:
... 返回t1PM.time(),t2.time()
>>>时间范围(“11:00-2:00PM”)
(datetime.time(11,0),datetime.time(14,0))
>>>时间范围(“下午4:00-5:00”)
(datetime.time(16,0),datetime.time(17,0))
>>>时间范围(“上午11:00-1:00”)
(datetime.time(23,0),datetime.time(1,0))
>>>时间范围(“11:00-2:00PM”)
(datetime.time(11,0),datetime.time(14,0))
>>>时间范围(“12:00-1:00PM”)
(datetime.time(12,0),datetime.time(13,0))
这将返回一个
time
对象,但如果需要,您可以将其滚动到datetime对象中。当您向我们展示(部分)您的代码时,可以更轻松地为您提供帮助。另外,你将左边的值解释为AM和PM并选择较小的增量的方法也是我的做法。哇,这是很多代码,你把实现复杂化了。你是对的,但您必须注意不要将6:00AM-6:00AM
视为长度0.6:00AM-6:00AM不符合OP提供的格式-第一次没有右侧的AM/PM指示器。但是如果6:00AM-6:00AM
的长度为0,因此比6:00PM-6:00AM
短,则6:00AM-6:00AM
可能意味着6:00AM
。但是,如果6:00AM-6:00AM
意味着24小时,6:00PM-6:00AM
更短,因此解决方案更简单。(完全明确地说,世界上的一些地区最终可以实现其他地区在大约90年前已经完成的转换,并编写18:00-06:00
,这样每个人都知道这意味着什么。SCNR)您可以在返回的元组中添加另一个指示器,以指示第二次是在第二天,如果第一次是下午,第二次是上午。这可能有助于计算OP中要求的时段持续时间。否则时间(23,0)->时间(1,0)将为-22小时…太棒了!非常感谢您,我尝试了我自己的实现,它与您的非常相似,尽管您的实现更优化。