如何调整和清理当前格式为乱七八糟的时间字符串的时间列表?

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 小时,同时处理以下问题:

我们很接近但目前卡住了,我们有:

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_timespm_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