我觉得很容易。
我有一个来自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}}
然后我不得不做三种而不是一种,需要按年分解阵列。那似乎不对,现在我被卡住了。我知道这应该很简单,但我不能为我的生活弄清楚。任何指针都赞赏。
谢谢,
添
答案 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