2010-12-10 13 views
8

Algo fácil, creo.Ordenar una matriz por columna de fecha textual en Mathematica

Tengo una lista de dos dimensiones (matriz) de fecha mezclada, texto y datos numéricos procedentes de un archivo CSV. Quiero poder ordenar las filas por el valor en una sola columna, que en este caso es una fecha en formato de texto. Por ejemplo:

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

me gustaría ordenar las filas en la lista de la fecha (por lo que sale en el orden Alice, Bob, Charlie.)

Hasta el momento he pensado que puede ser que desee asignar DateList a través de mi columna de fecha y anteponer el año, mes y día a la lista, por lo que se convierte en:

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

Entonces me quedo tener que hacer tres tipos en lugar de uno , y la necesidad de romper la matriz por año. Eso no parecía correcto y ahora estoy atascado. Sé que esto debería ser simple, pero no puedo por la vida de mí resolverlo. Cualquier puntero apreciado.

Gracias,

Tim

Respuesta

11

... Tal vez esto

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

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

da

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

HTH

Edición

Tenga en cuenta que Ordenar [] compara usando OrderedQ [], y por lo que puede comparar la lista. (Greater [], por ejemplo, no puede).

Por lo tanto, el siguiente código también funciona:

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

o quizás más elegante:

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

leyenda. Gracias, belisario, funcionó perfectamente. ¡Pasé horas revisando los documentos y nunca vi una referencia a SortBy o AbsoluteTime! –

+0

+1, nunca antes había escuchado sobre 'SortBy'. Siempre he usado 'Sort', más funciones de clasificación personalizadas. – rcollyer

+0

A mí también me gusta esta solución (y yo tampoco había oído hablar de AbsoluteTime). Una ligera variación es que DateList (con el que había estado jugando) también funcionará, como en: SortBy [l, DateList [{# [[1]], {"Day", "Month", "Year"}} ] &] // TableForm – tomd

2

Una alternativa a Belisario segundo método:

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

Sí, me gusta DateList :-) – tomd

Cuestiones relacionadas