在Python中排序日期字符串,最好不使用日期对象

在Python中排序日期字符串,最好不使用日期对象,python,python-3.x,sorting,Python,Python 3.x,Sorting,所以,我有一个字符串列表,这些字符串都是用Month DayNumber格式化的,比如 我需要对列表进行排序,以便所有日期都按照日历中的顺序排列。有什么建议吗?是否有一种内置方法可以帮助我,或者我是否应该使用lambda设计自定义排序?您可能想回顾一下这个问题: 解析后,您可以根据从将字符串解析为可排序的datetime对象中获得的值,按日期进行排序。您可能需要查看以下问题: 解析后,您可以根据从将字符串解析为可排序的datetime对象中获得的值按日期进行排序。可能性: 使用字典并使用键/值

所以,我有一个字符串列表,这些字符串都是用Month DayNumber格式化的,比如


我需要对列表进行排序,以便所有日期都按照日历中的顺序排列。有什么建议吗?是否有一种内置方法可以帮助我,或者我是否应该使用lambda设计自定义排序?

您可能想回顾一下这个问题:


解析后,您可以根据从将字符串解析为可排序的datetime对象中获得的值,按日期进行排序。

您可能需要查看以下问题:

解析后,您可以根据从将字符串解析为可排序的datetime对象中获得的值按日期进行排序。

可能性:

使用字典并使用键/值 使用字符串匹配正则表达式 还有很多。。。 或谷歌,并使用以下任何一种:

要提供可能的解决方案:

Input_list = [{'month':'March', 'day':30}, {'month':'March', 'day':10}]

newlist = sorted(Input_list, key=lambda k: k['month']) 
可能性:

使用字典并使用键/值 使用字符串匹配正则表达式 还有很多。。。 或谷歌,并使用以下任何一种:

要提供可能的解决方案:

Input_list = [{'month':'March', 'day':30}, {'month':'March', 'day':10}]

newlist = sorted(Input_list, key=lambda k: k['month']) 

您还可以利用日历模块:

from calendar import month_name
months = list(month_name)

def parser (text):
    """Parses 'englishmonthname_whitespace_day-number' into string 'monthNR.dayNr'. 
    Will pad a zero to allow for string based sorting."""  
    try:
        month,day = text.split()
        monthAsIdx = months.index(month.strip())
        return '{:02d}.{:02d}'.format(monthAsIdx,int(day)) # return index in list.days
    except (ValueError, IndexError): # ValueError if not enough elements in string,
                                     # IndexError if not in list of month names
        return "99.99" # put last - all errors are put last w/o specific reordering

dates = ['TooFew', 'EnoughBut NotInList', 'March 1', 'March 9', 'April 14', 'March 12'] 

for n in dates:
    print(parser(n))


sortedDates = sorted(dates, key=lambda x: parser(x))

print(sortedDates)
输出:

# result of parser()
99.99
99.99
03.01
03.09
04.14
03.12

# sorted by key/lambda
['March 1', 'March 9', 'March 12', 'April 14', 'TooFew', 'EnoughBut NotInList'] 

您还可以利用日历模块:

from calendar import month_name
months = list(month_name)

def parser (text):
    """Parses 'englishmonthname_whitespace_day-number' into string 'monthNR.dayNr'. 
    Will pad a zero to allow for string based sorting."""  
    try:
        month,day = text.split()
        monthAsIdx = months.index(month.strip())
        return '{:02d}.{:02d}'.format(monthAsIdx,int(day)) # return index in list.days
    except (ValueError, IndexError): # ValueError if not enough elements in string,
                                     # IndexError if not in list of month names
        return "99.99" # put last - all errors are put last w/o specific reordering

dates = ['TooFew', 'EnoughBut NotInList', 'March 1', 'March 9', 'April 14', 'March 12'] 

for n in dates:
    print(parser(n))


sortedDates = sorted(dates, key=lambda x: parser(x))

print(sortedDates)
输出:

# result of parser()
99.99
99.99
03.01
03.09
04.14
03.12

# sorted by key/lambda
['March 1', 'March 9', 'March 12', 'April 14', 'TooFew', 'EnoughBut NotInList'] 
一种方法是将numpy.argsort与datetime库结合使用

结果:

['March 1', 'March 9', 'March 12', 'April 14']
这是可能的,因为在内部,日期只是数字数据。在这种情况下,我们附加一个任意年份来创建datetime对象。

一种方法是将numpy.argsort与datetime库结合使用

结果:

['March 1', 'March 9', 'March 12', 'April 14']

这是可能的,因为在内部,日期只是数字数据。在本例中,我们附加任意年份2018以创建datetime对象。

您可以使用pandas模块。 用pip安装它

您可以这样做:

import pandas as pd

dates = ['March 1', 'March 9', 'April 14', 'March 12']

df = pd.DataFrame(dates)
df = pd.to_datetime(df[0], format="%B %d")

df=df.sort_values() 

print (df)
此日期时间格式非常有用,例如,如果您想要列表中某个元素的日期或月份,只需执行以下操作:

df.month
df.day

您可以使用熊猫模块。 用pip安装它

您可以这样做:

import pandas as pd

dates = ['March 1', 'March 9', 'April 14', 'March 12']

df = pd.DataFrame(dates)
df = pd.to_datetime(df[0], format="%B %d")

df=df.sort_values() 

print (df)
此日期时间格式非常有用,例如,如果您想要列表中某个元素的日期或月份,只需执行以下操作:

df.month
df.day

除了关键参数之外?除了关键参数之外?我已经这样做了,并对代码进行了分类测试,key=lambda x:datetime.datetime.strptimex,'%m-%Y-%d',但它不起作用,所以我回到绘图板上。你确定%Y应该在那里吗?我将只使用“%B%d”,其中%B是当前区域设置中的完整月份名称。你提供的数据对我来说很有吸引力。我的数据与我最初写的不一样,我的错。问题是数据是以列表而不是字符串的形式传递的,并引发错误。我会调查的,谢谢你的帮助。我已经这样做了,并对代码进行了分类测试,key=lambda x:datetime.datetime.strptimex,'%m-%Y-%d',但它不起作用,所以我回到绘图板上。你确定%Y应该在那里吗?我将只使用“%B%d”,其中%B是当前区域设置中的完整月份名称。你提供的数据对我来说很有吸引力。我的数据与我最初写的不一样,我的错。问题是数据是以列表而不是字符串的形式传递的,并引发错误。我会调查的,谢谢你的帮助。