2010-12-10 187 views
8

我觉得很容易。在Mathematica中按文本日期列对数组进行排序

我有一个来自CSV的混合日期,文本和数字数据的二维列表(数组)。我希望能够通过单列中的值对行进行排序,在这种情况下,这是一个文本格式的日期。例如:

{{1/12/2008, Bob, 123}, {28/06/2007, Alice, 456}, {19/08/2009, Charlie, 789}}

我想用

到目前为止,我已经想好了日期(这样出来的顺序爱丽丝,鲍勃,查理。)在列表中的行进行排序我可能要地图DateList在我的日期列且在前面加上年份,月份和日期到列表中,因此它变成:

{{2008, 12, 1, Bob, 123}, {2007, 6, 28, Alice, 456}}

然后我留下不必做三大类,而不是一个,并且需要逐年打破阵容。这看起来不正确,现在我卡住了。我知道这应该是简单的,但我不能为我的生活弄清楚。任何指针赞赏。

感谢,

回答

11

或许这...

l = {{"1/12/2008", Bob, 123}, {"28/06/2007", Alice, 456}, 
    {"19/08/2009", Charlie, 789}} 

SortBy[l, AbsoluteTime[{#[[1]], {"Day", "Month", "Year"}}] &] 

{{"28/06/2007", Alice, 456}, 
{"1/12/2008", Bob,  123}, 
{"19/08/2009", Charlie, 789}} 

HTH

编辑

注意排序[]使用OrderedQ [],所以它可以比较列表进行比较。 (例如[Greater [])不能)。

所以,下面的代码也可以工作:

[email protected]([email protected]{DateList[{#[[1]],{"Day","Month","Year"}}], #[[2]], #[[3]]} & /@ l) 

或者更优雅:

[email protected](l/.{x_String, y__} :> [email protected]{DateList[{x, {"Day", "Month", "Year"}}], y}) 
+0

传奇。感谢belisarius,完美的工作。我花了数小时浏览文档,从未看到对SortBy或AbsoluteTime的引用! – 2010-12-11 03:50:20

+0

+1,之前从未听说过'SortBy'。我一直使用'Sort',加上自定义的排序功能。 – rcollyer 2010-12-11 04:50:12

+0

我也喜欢这个解决方案(我也没有听说过AbsoluteTime)。稍微有一点变化就是DateList(我一直在玩)也会起作用,如:SortBy [l,DateList [{#[[1]],{“Day”,“Month”,“Year”}} ]&] // TableForm – tomd 2010-12-11 11:02:03

2

的替代贝利萨留第二种方法:

lst = {{"1/12/2008", Bob, 123}, 
     {"28/06/2007", Alice, 456}, 
     {"19/08/2009", Charlie, 789}}; 

lst = {[email protected]{#, {"Day", "Month", "Year"}}, ##2} & @@@ lst; 

[email protected] 
+0

是的,我喜欢DateList :-) – tomd 2011-03-24 13:06:43

相关问题