【问题标题】:Converting different time formats into same format and finding difference between 2 times将不同的时间格式转换为相同的格式并找出2次之间的差异
【发布时间】:2020-08-07 11:57:00
【问题描述】:

希望你们一切都好。

我一直在解决这个特殊的问题,即找出 2 次之间的时间差(所有不同的格式)。我已经部分解决了某些情况,但目前不明白如何为所有情况创建解决方案。

我的分步过程包括:

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

  • 发现时间以不同的字符串格式表示以正确转换为日期时间格式而不丢失 PM 准确性的情况仍然是 PM,如果它是 '4' 而不是 4PM 或 16:00,则不转换为 AM

  • 然后...计算2次之间的差异(一次以日期时间格式)

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

  • 16-19
  • 19.30-20.00
  • 5PM-6PM
  • 4-5
  • 5-5.10PM
  • 16 - 18(是的,数字和连字符之间的空格是故意的,尽管一些字符串操作应该很简单地解决这个问题)
  • 12 - 14

我已设法将 16-19 转换为:16:00:00 和 19:00:00,但是对于 19.30-20.00 示例,我收到以下错误:ValueError("unconverted data remains: %s" % ValueError: unconverted data remains: .30

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

theDate1, theDate2 = datetime.strptime(temp[0: temp.find('-')], "%H"), datetime.strptime(temp[temp.find('-') + 1: len(temp)], "%H")

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

抱歉,如果我的解释有点过头了...我正处于一起破解解决方案并尝试所有不同组合的顶空。

感谢您对此的任何指导!

祝你有美好的一天。

【问题讨论】:

    标签: python python-3.x string datetime


    【解决方案1】:

    这个错误非常明确:您正在尝试使用格式 '%H' 解析 '19.30',它匹配 19,所以 '.30' 不匹配。

    使用格式 '%H.%M' 代替对我有用 ;)

    另外,请查看dateutil 包,它旨在使解析更容易。例如:

    >>> from datetutil.parser import parse
    >>> parse('5PM')
    datetime.timedelta(seconds=3600)
    >>> parse('19h') - parse('17h45')
    datetime.timedelta(seconds=4500)
    >>> parse('19:00') - parse('18:30')
    datetime.timedelta(seconds=1800)
    

    它真的很强大,可以处理很多小细节,比如空格等;)

    【讨论】:

    • 不幸的是,dateutil 的解析器不会立即解析所有 OP 的示例字符串..
    【解决方案2】:

    这是一种使用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])
    

    给予

    '16-19' processed to -> ['16', '19']
    [datetime.time(16, 0), datetime.time(19, 0)]
    
    '19.30-20.00' processed to -> ['19:30', '20:00']
    [datetime.time(19, 30), datetime.time(20, 0)]
    
    '5PM-6PM' processed to -> ['5PM', '6PM']
    [datetime.time(17, 0), datetime.time(18, 0)]
    
    '4-5' processed to -> ['4:00', '5:00']
    [datetime.time(4, 0), datetime.time(5, 0)]
    
    '5-5.10PM' processed to -> ['5:00PM', '5:10PM']
    [datetime.time(17, 0), datetime.time(17, 10)]
    
    '16 - 18' processed to -> ['16', '18']
    [datetime.time(16, 0), datetime.time(18, 0)]
    
    '12 - 14' processed to -> ['12', '14']
    [datetime.time(12, 0), datetime.time(14, 0)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-21
      • 1970-01-01
      相关资源
      最近更新 更多