在Mathematica中按文本日期列对数组进行排序

时间:2010-12-10 22:18:27

标签: wolfram-mathematica

我觉得很容易。

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

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

我想按日期对列表中的行进行排序(因此按照Alice,Bob,Charlie的顺序排列。)

到目前为止,我认为我可能希望将DateList映射到我的日期列,并将年,月和日添加到列表中,因此它变为:

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

然后我不得不做三种而不是一种,需要按年分解阵列。那似乎不对,现在我被卡住了。我知道这应该很简单,但我不能为我的生活弄清楚。任何指针都赞赏。

谢谢,

2 个答案:

答案 0 :(得分: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 [] 进行比较,因此可以比较列表。 (例如,大[]不能)。

因此,以下代码也有效:

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

或者更优雅:

Sort@(l/.{x_String, y__} :> Flatten@{DateList[{x, {"Day", "Month", "Year"}}], y})

答案 1 :(得分:2)

belisarius第二种方法的替代方案:

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

lst = {DateList@{#, {"Day", "Month", "Year"}}, ##2} & @@@ lst;

Sort@lst