Python:排序日期时间对象时考虑“AM”和“PM”

0 投票
1 回答
2367 浏览
提问于 2025-04-17 19:48

这是我问题的简化版本,简单来说就是:我有一个脚本,用正则表达式(Regex)来找出特定模式,从而对电子邮件进行排序。其中一个排序的依据是邮件收到的日期。我使用datetime模块来格式化日期字符串,像这样:

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

现在,假设我已经解析了4封邮件,这些是正则表达式函数的结果:

    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()/strftime()函数中把%H改成%I,以适应12小时制,但我已经这样做了。有没有人能建议我如何在排序时考虑%p呢?谢谢!

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]

这里使用了列表推导式,可以很方便地对所有对象进行格式化。

撰写回答