这是我的问题的简化版本,但这里是它的要点:我有一个脚本,通过使用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?谢谢!
答案 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轻松地将格式应用于所有对象。