Сортировка массива по столбцу текстовой даты в 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