Python:排序日期时间对象时考虑“AM”和“PM”
这是我问题的简化版本,简单来说就是:我有一个脚本,用正则表达式(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]
这里使用了列表推导式,可以很方便地对所有对象进行格式化。