Python 将不同的时间格式转换为相同的格式,并查找两次之间的差异

Python 将不同的时间格式转换为相同的格式,并查找两次之间的差异,python,python-3.x,string,datetime,Python,Python 3.x,String,Datetime,希望你们都做得很好 我一直在研究这个特殊的问题,寻找两次之间的时间差(这两次的格式都不同)。对于某些情况,我已经部分解决了这个问题,但目前无法理解如何为所有情况创建解决方案 我的逐步过程包括: 将所有数据(最初为字符串格式)转换为日期时间格式 如果时间以字符串格式以不同方式表示,以便正确转换为datetime格式而不丢失PM的准确性,则查找这种情况仍然是PM,如果时间为“4”,而不是下午4点或16:00,则不会转换为AM 然后。。。计算两次之间的差异(以datetime格式计算一次)

希望你们都做得很好

我一直在研究这个特殊的问题,寻找两次之间的时间差(这两次的格式都不同)。对于某些情况,我已经部分解决了这个问题,但目前无法理解如何为所有情况创建解决方案

我的逐步过程包括:

  • 将所有数据(最初为字符串格式)转换为日期时间格式

  • 如果时间以字符串格式以不同方式表示,以便正确转换为datetime格式而不丢失PM的准确性,则查找这种情况仍然是PM,如果时间为“4”,而不是下午4点或16:00,则不会转换为AM

  • 然后。。。计算两次之间的差异(以datetime格式计算一次)

一些细节包括查找以下时间的时差(在本例中最初存储为字符串):

  • 16-19
  • 19.30-20.00
  • 下午五时至六时
  • 4-5
  • 下午五时至五时十分
  • 16-18(是的,数字和连字符之间的空格是有意的,尽管一些字符串操作应该可以非常简单地解决这个问题)
  • 12-14
我已成功将16-19转换为:16:00:00和19:00:00,但是对于19.30-20.00示例,我收到以下错误:
ValueError(“未转换的数据保留:%s”%ValueError:未转换的数据保留:.30

我假设这是由于我的代码实现:

date1,date2=datetime.strtime(temp[0:temp.find('-')]),%H),datetime.strtime(temp[temp.find('-')+1:len(temp)],%H)

…其中19.30-20.00包含一个%M部分,而不仅仅是一个%H,因此代码没有说明如何处理:30部分。我将尝试一个条件部分,其中如果字符串有16-19,则运行一些代码,如果字符串有19.30-20.00,则运行一些其他代码(其他示例也是如此)

抱歉,如果我的解释有点全面…我正在一起破解一个解决方案,并尝试所有不同的组合

谢谢你的指导


祝您愉快。

这个错误非常明确:您试图用格式“%H”解析“19.30”,它与19匹配,因此“.30”保持不匹配

改为使用格式“%H.%M”对我有效;)

另外,请看一下
dateutil
包,它旨在简化解析。例如:

>>来自datetutil.parser导入解析
>>>解析('5PM')
datetime.timedelta(秒=3600)
>>>parse('19h')-parse('17h45'))
datetime.timedelta(秒=4500)
>>>解析('19:00')-解析('18:30'))
datetime.timedelta(秒=1800)

它非常强大,可以处理很多小细节,比如空白等等;)

这个错误非常明确:您试图用与19匹配的格式“%H”解析“19.30”,因此“.30”不匹配

改为使用格式“%H.%M”对我有效;)

另外,请看一下
dateutil
包,它旨在简化解析。例如:

>>来自datetutil.parser导入解析
>>>解析('5PM')
datetime.timedelta(秒=3600)
>>>parse('19h')-parse('17h45'))
datetime.timedelta(秒=4500)
>>>解析('19:00')-解析('18:30'))
datetime.timedelta(秒=1800)

它非常强大,可以处理很多小细节,比如空白等等;)

这里有一种方法可以在经过一些预处理后,使用
dateutil
的解析器解析示例字符串:

from dateutil import parser

strings = ['16-19', '19.30-20.00', '5PM-6PM', '4-5' ,'5-5.10PM', '16 - 18', '12 - 14']
datepfx = '2020-07-21 ' # will prefix this so parser.parse works correctly

for s in strings:
    # split on '-', strip trailing spaces
    # replace . with : as time separator, ensure upper-case letters
    parts = [part.strip().replace('.',':').upper() for part in s.split('-')]
    # if only one number is given, assume hour and add minute :00
    parts = [p+':00' if len(p)==1 else p for p in parts]
    # check if AM or PM appears in only one of the parts
    ampm = [i for i in ('AM', 'PM') for p in parts if i in p]
    if len(ampm) == 1:
        parts = [p+ampm[0] if not ampm[0] in p else p for p in parts]      

    print(f"\n'{s}' processed to -> {parts}")
    print([parser.parse(datepfx + p).time() for p in parts])
给予


下面是一种在经过一些预处理后使用
dateutil
解析器解析示例字符串的方法:

from dateutil import parser

strings = ['16-19', '19.30-20.00', '5PM-6PM', '4-5' ,'5-5.10PM', '16 - 18', '12 - 14']
datepfx = '2020-07-21 ' # will prefix this so parser.parse works correctly

for s in strings:
    # split on '-', strip trailing spaces
    # replace . with : as time separator, ensure upper-case letters
    parts = [part.strip().replace('.',':').upper() for part in s.split('-')]
    # if only one number is given, assume hour and add minute :00
    parts = [p+':00' if len(p)==1 else p for p in parts]
    # check if AM or PM appears in only one of the parts
    ampm = [i for i in ('AM', 'PM') for p in parts if i in p]
    if len(ampm) == 1:
        parts = [p+ampm[0] if not ampm[0] in p else p for p in parts]      

    print(f"\n'{s}' processed to -> {parts}")
    print([parser.parse(datepfx + p).time() for p in parts])
给予


不幸的是,dateutil的解析器不会立即解析OP的所有示例字符串。不幸的是,dateutil的解析器不会立即解析OP的所有示例字符串。。