Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:将不明确的小时数转换为时间对象的有效方法?_Python_Datetime - Fatal编程技术网

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相同
即使在最长的时间段,如6:00-6:00AM(6:00PM-6:00AM比6:00AM-6:00AM短)也有效

第二个观察结果是,您不能使用简单的时间对象,因为

  • AM->PM持续时间发生在一天的边界(午夜)。在这种情况下,这可能会破坏时间增量的计算
因此,我认为您必须使用datetime,或者将所有这些都封装在一个结构中,该结构表示第一个time对象中的时间是前一天


希望这有帮助:)

这里是一个简单的实现

    >>> 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小时…太棒了!非常感谢您,我尝试了我自己的实现,它与您的非常相似,尽管您的实现更优化。