Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:对datetime对象进行排序,同时考虑“AM”和“PM”_Python_Sorting_Datetime_Strftime_Strptime - Fatal编程技术网

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

Python:对datetime对象进行排序,同时考虑“AM”和“PM”,python,sorting,datetime,strftime,strptime,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') L = [s2, s1, s3, s4] L.sort() 现在,

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

    s1 = datetime.strptime(regex_obtained_str, '%B %d, %Y, %I:%M:%S %p').strftime('%m/%d/%Y %I:%M:%S %p')
    L = [s2, s1, s3, s4]
    L.sort()
现在,假设我已经解析了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'
如果我将所有这些以随机顺序放入一个列表中,并执行排序函数,如下所示:

    s1 = datetime.strptime(regex_obtained_str, '%B %d, %Y, %I:%M:%S %p').strftime('%m/%d/%Y %I:%M:%S %p')
    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上研究了许多与此类似的问题,所有这些问题都建议将strTime/strftime函数中的%H更改为%I,以说明12小时时钟,但我已经这样做了。有人能建议在排序时如何考虑%p吗?谢谢

这里的问题是您正在对字符串进行排序—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]

此处使用可将格式轻松应用于所有对象。

为什么要将它们作为字符串排序?将它们按时间排序,然后生成字符串。@Lattyware这可能就是这个问题的答案。我创建了一个大的电子邮件列表,所有电子邮件都已经是字符串,然后我使用正则表达式在电子邮件中的特定模式后查找日期。举个例子,我使用的函数类型是:L.sortkey=lambda I:I[每封邮件的某个片段],Regex\u date\u submitted\u finderi-听起来像是你建议我只做另一个函数,只调用strtime而不调用strftime,然后排序?如果字符串s1、s2等的格式如你所说的“2013年3月15日8:58:34 PM”,只需执行L=[s2,s1,s3,34],然后执行L.sort,输出中不可能有不同日期格式的字符串。那么,是哪一个?如果是第一次,你会有更多的问题-‘一月’>‘二月’、‘九’>‘十’等等。为了澄清,我打电话给strftime来重新格式化它们!这是有道理的。事实上,几乎每次按字符串排序都很有效,但我正在查看结果,偶尔一封电子邮件会出现问题。我会在5分钟内给出答案,但不会立即让我回答