Сортировка массива по столбцу текстовой даты в Mathematica

что-то легкое, я думаю.

у меня есть двумерный список (массив) смешанных даты, текста и числовых данных, полученных из CSV. Я хочу иметь возможность сортировать строки по значению в одном столбце, что в данном случае является датой в текстовом формате. Например:

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

Я хотел бы отсортировать строки в списке по дате (так что выходит в порядке Алиса, Боб, Чарли.)

до сих пор я думал, что я, возможно, захочу map DateList через мой столбец даты и добавьте год, месяц и день в список, чтобы он стал:

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

тогда мне остается делать три вида вместо одного, и мне нужно разбить массив по годам. Это казалось неправильным, и теперь я застрял. Я знаю, что это должно быть просто, но я не могу, хоть убей, понять это. Любые указатели оценены.

спасибо,

Тим

2 ответов


возможно, это ...

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 [ ], например, не может).

Итак, следующий код также работает:

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

или, возможно, более элегантно:

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

альтернатива второму методу Велисария:

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