0

这是我的问题的简化版本,但这里是它的要点:我有一个脚本,它使用正则表达式对电子邮件进行排序以查找特定模式。我排序的项目之一是收到电子邮件的日期。我使用 datetime 模块来格式化日期字符串,如下所示:

    s1 = datetime.strptime(regex_obtained_str, '%B %d, %Y, %I:%M:%S %p').strftime('%m/%d/%Y %I:%M:%S %p')

现在,假设我已经解析了 4 封电子邮件,这些是 Regex 函数的结果:

    s1 = 'March 15, 2013 8:58:34 PM'
    s2 = 'March 15, 2013 11:10:10 AM'
    s3 = 'March 15, 2013 11:16:06 AM'
    s4 = 'April 15, 2013 12:02:04 PM'

在 strftime 格式化后变成这样:

    s1 = '03/15/2013 08:58:34 PM'
    s2 = '03/15/2013 11:10:10 AM'
    s3 = '03/15/2013 11:16:06 AM'
    s4 = '04/15/2013 12:02:04 PM'

如果我将这些都按随机顺序放在一个列表中并执行 sort() 函数,如下所示:

    L = [s2, s1, s3, s4]
    L.sort()

输出是:

    ['03/15/2013 08:58:34 PM', '03/15/2013 11:10:10 AM', '03/15/2013 11:16:06 AM', '04/15/2013 12:02:04 PM']

如您所见,排序时没有考虑“AM”和“PM”。我在 StackOverflow 上查看了许多与此类似的其他问题,所有这些问题都建议在 strptime()/stftime() 函数中将 %H 更改为 %I 以说明 12 小时制,但我已经完成了那。任何人都可以建议在排序时如何考虑 %p 吗?谢谢!

4

1 回答 1

7

这里的问题是您正在对字符串进行排序 - Python 不知道这些字符串是时间,所以它只是将它们排序为字符串(这几乎可以工作)。

所以,解决方案是,当它们是日期对象时对它们进行排序,此时,Python 拥有正确排序它们所需的信息:

dates = sorted([datetime.strptime(regex_obtained_str, '%B %d, %Y, %I:%M:%S %p') 
                for regex_obtained_str in strings])
l = [date.strftime('%m/%d/%Y %I:%M:%S %p') for date in dates]

这里使用列表推导轻松地将格式应用于所有对象。

于 2013-03-20T22:10:51.383 回答