Python:对datetime对象进行排序,同时考虑“AM”和“PM”

时间:2013-03-20 22:03:59

标签: python sorting datetime strftime strptime

这是我的问题的简化版本,但这里是它的要点:我有一个脚本,通过使用Regex查找特定模式来对电子邮件进行排序。我排序的其中一项是收到电子邮件的日期。我使用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?谢谢!

1 个答案:

答案 0 :(得分: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]

这里使用list comprehensions轻松地将格式应用于所有对象。