如何调整和清理当前格式为乱七八糟的时间字符串的时间列表?
How to adjust and clean a list of times, currently formatted as messy strings of times?
我们有一个杂乱无章的 python 列表,其中包含我们正在努力清理的字符串形式的时间:
our_times = ['3:40 PM ', '11:07 PM ', 'Fri 8/06, 12:10 AM ', '11:10 PM ',
'5:10 PM ', '6:05 PM ', 'Fri 8/06, 12:10 AM ', '8:05 PM ',
'7:10 PM ', '11:05 PM ', 'Fri 8/06, 12:15 AM ', 'BOT 3RD: 0-1, 1 Out']
我们需要将时间回滚 4 小时,同时处理以下问题:
- 一些元素(见最后一个元素)不是日期时间。我们可以通过缺少
AM
或 PM
. 来检测这些
- 有些元素有日期前缀,其格式始终为
Mon 2/01
,其中 2
是月份 (1-12),01
是日期 (1- 31).
我们很接近但目前卡住了,我们有:
clean_times = [elem.strip() for elem in our_times]
pm_times = [elem.split(' ')[0] if elem.find('PM') > 0 else '' for elem in clean_times]
am_times = [elem.split(' ')[2] if elem.find('AM') > 0 else '' for elem in clean_times]
in_progress = [elem if elem.find('AM') == -1 and elem.find('PM') == -1 else '' for elem in clean_times]
new_times = [i + j + k for i, j, k in zip(pm_times, am_times, in_progress)]
new_times
['3:40', '11:07', '12:10', '11:10',
'5:10', '6:05', '12:10', '8:05',
'7:10', '11:05', '12:15', 'BOT 3RD: 0-1, 1 Out']
我们被困在如何将这些时间回滚 4 小时的问题上。特别是像 3:40 PM
这样需要设置为 12:40 AM
的时间,处理起来似乎很棘手。为此,我们可能希望在创建 new_times
之前转换为 am_times
和 pm_times
。我们要做的是:
new_times
['12:40 AM', '7:07 PM', '8:10 PM', '7:10 PM',
'1:10 PM', '2:05 PM', '8:10 PM', '4:05 PM',
'3:10 PM', '7:05 PM', '8:15 PM', 'BOT 3RD: 0-1, 1 Out']
一般来说,如果能避免使用字符串操作来解析日期和时间,而是将它们放入datetime
对象中,就更容易避免错误。
你可以利用 dateutil.parser
。如果它不能解析时间,那么就 return 字符串。
由于你的时间现在是实时对象,回滚四个小时是微不足道的——你只需减去时间增量:
from dateutil.parser import parse
from datetime import timedelta, datetime
def find_time(t):
try:
return parse(t.strip())
except ValueError:
return t
def format_time_with_delta(dt, delta):
if not isinstance(dt, datetime):
return dt
return datetime.strftime(dt + delta, '%I:%M %p')
our_times = ['3:40 PM ', '11:07 PM ', 'Fri 8/06, 12:10 AM ', '11:10 PM ',
'5:10 PM ', '6:05 PM ', 'Fri 8/06, 12:10 AM ', '8:05 PM ',
'7:10 PM ', '11:05 PM ', 'Fri 8/06, 12:15 AM ', 'BOT 3RD: 0-1, 1 Out']
# times is a list of either datetime objects or strings
times = [find_time(t) for t in our_times]
res = [format_time_with_delta(dt, timedelta(hours=-4)) for dt in times]
结果将是一个列表,如:
['11:40 AM',
'07:07 PM',
'08:10 PM',
'07:10 PM',
'01:10 PM',
'02:05 PM',
'08:10 PM',
'04:05 PM',
'03:10 PM',
'07:05 PM',
'08:15 PM',
'BOT 3RD: 0-1, 1 Out']
如果您不想使用 dateutil.parser
,您可以制作一个像这样的 find_time
函数来尝试已知格式。但是,您需要跟踪您期望的格式。如果事实证明您有其他字符串格式,您可以将它们添加到 formats
元组中:
from datetime import datetime, timedelta
def find_time(t):
formats = ('%I:%M %p', '%a %m/%d, %I:%M %p')
for f in formats:
try:
return datetime.strptime(t.strip(), f)
except ValueError:
pass
return t
我们有一个杂乱无章的 python 列表,其中包含我们正在努力清理的字符串形式的时间:
our_times = ['3:40 PM ', '11:07 PM ', 'Fri 8/06, 12:10 AM ', '11:10 PM ',
'5:10 PM ', '6:05 PM ', 'Fri 8/06, 12:10 AM ', '8:05 PM ',
'7:10 PM ', '11:05 PM ', 'Fri 8/06, 12:15 AM ', 'BOT 3RD: 0-1, 1 Out']
我们需要将时间回滚 4 小时,同时处理以下问题:
- 一些元素(见最后一个元素)不是日期时间。我们可以通过缺少
AM
或PM
. 来检测这些
- 有些元素有日期前缀,其格式始终为
Mon 2/01
,其中2
是月份 (1-12),01
是日期 (1- 31).
我们很接近但目前卡住了,我们有:
clean_times = [elem.strip() for elem in our_times]
pm_times = [elem.split(' ')[0] if elem.find('PM') > 0 else '' for elem in clean_times]
am_times = [elem.split(' ')[2] if elem.find('AM') > 0 else '' for elem in clean_times]
in_progress = [elem if elem.find('AM') == -1 and elem.find('PM') == -1 else '' for elem in clean_times]
new_times = [i + j + k for i, j, k in zip(pm_times, am_times, in_progress)]
new_times
['3:40', '11:07', '12:10', '11:10',
'5:10', '6:05', '12:10', '8:05',
'7:10', '11:05', '12:15', 'BOT 3RD: 0-1, 1 Out']
我们被困在如何将这些时间回滚 4 小时的问题上。特别是像 3:40 PM
这样需要设置为 12:40 AM
的时间,处理起来似乎很棘手。为此,我们可能希望在创建 new_times
之前转换为 am_times
和 pm_times
。我们要做的是:
new_times
['12:40 AM', '7:07 PM', '8:10 PM', '7:10 PM',
'1:10 PM', '2:05 PM', '8:10 PM', '4:05 PM',
'3:10 PM', '7:05 PM', '8:15 PM', 'BOT 3RD: 0-1, 1 Out']
一般来说,如果能避免使用字符串操作来解析日期和时间,而是将它们放入datetime
对象中,就更容易避免错误。
你可以利用 dateutil.parser
。如果它不能解析时间,那么就 return 字符串。
由于你的时间现在是实时对象,回滚四个小时是微不足道的——你只需减去时间增量:
from dateutil.parser import parse
from datetime import timedelta, datetime
def find_time(t):
try:
return parse(t.strip())
except ValueError:
return t
def format_time_with_delta(dt, delta):
if not isinstance(dt, datetime):
return dt
return datetime.strftime(dt + delta, '%I:%M %p')
our_times = ['3:40 PM ', '11:07 PM ', 'Fri 8/06, 12:10 AM ', '11:10 PM ',
'5:10 PM ', '6:05 PM ', 'Fri 8/06, 12:10 AM ', '8:05 PM ',
'7:10 PM ', '11:05 PM ', 'Fri 8/06, 12:15 AM ', 'BOT 3RD: 0-1, 1 Out']
# times is a list of either datetime objects or strings
times = [find_time(t) for t in our_times]
res = [format_time_with_delta(dt, timedelta(hours=-4)) for dt in times]
结果将是一个列表,如:
['11:40 AM',
'07:07 PM',
'08:10 PM',
'07:10 PM',
'01:10 PM',
'02:05 PM',
'08:10 PM',
'04:05 PM',
'03:10 PM',
'07:05 PM',
'08:15 PM',
'BOT 3RD: 0-1, 1 Out']
如果您不想使用 dateutil.parser
,您可以制作一个像这样的 find_time
函数来尝试已知格式。但是,您需要跟踪您期望的格式。如果事实证明您有其他字符串格式,您可以将它们添加到 formats
元组中:
from datetime import datetime, timedelta
def find_time(t):
formats = ('%I:%M %p', '%a %m/%d, %I:%M %p')
for f in formats:
try:
return datetime.strptime(t.strip(), f)
except ValueError:
pass
return t