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
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的所有示例字符串。。