2010-12-10 25 views
8

Điều gì đó dễ dàng tôi nghĩ.Sắp xếp một mảng theo cột ngày văn bản trong Mathematica

Tôi có danh sách hai chiều (mảng) dữ liệu ngày, văn bản và dữ liệu số hỗn hợp có nguồn gốc từ CSV. Tôi muốn có thể sắp xếp các hàng theo giá trị trong một cột, trong trường hợp này là một ngày ở định dạng văn bản. Ví dụ:

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

Tôi muốn sắp xếp các hàng trong danh sách bằng cách ngày (vì vậy mà đi ra theo trình tự Alice, Bob, Charlie.)

Cho đến nay tôi đã nghĩ mà tôi có thể muốn để lập bản đồ DateList trên cột ngày của tôi và thêm vào trước năm, tháng và ngày vào danh sách, vì vậy nó trở thành:

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

Sau đó, tôi đang trái phải làm ba loại thay vì một và cần phải phá vỡ mảng này theo năm. Điều đó có vẻ không đúng và bây giờ tôi đang bị mắc kẹt. Tôi biết điều này nên được đơn giản nhưng tôi không thể cho cuộc sống của tôi con số nó ra. Bất kỳ con trỏ nào được đánh giá cao.

Cảm ơn,

Tim

Trả lời

11

Có lẽ đây ...

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

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

cho

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

HTH

Sửa

Lưu ý rằng Sắp xếp [] so sánh sử dụng OrderedQ [], và vì vậy nó có thể so sánh danh sách. (Greater [], ví dụ, không thể).

Vì vậy, các mã sau đây cũng làm việc:

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

hoặc có lẽ tao nhã hơn:

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

Legend. Cảm ơn belisarius, đã làm việc hoàn hảo. Tôi đã dành hàng giờ rùng rợn thông qua các tài liệu và không bao giờ thấy một tham chiếu đến SortBy, hoặc AbsoluteTime! –

+0

+1, chưa bao giờ nghe nói về 'SortBy' trước đây. Tôi đã luôn luôn sử dụng 'Sắp xếp', cộng với chức năng sắp xếp tùy chỉnh. – rcollyer

+0

Tôi cũng thích giải pháp này (và tôi cũng đã không nghe nói về AbsoluteTime). Một biến thể nhỏ là DateList (mà tôi đã chơi xung quanh) cũng sẽ hoạt động, như sau: SortBy [l, DateList [{# [[1]], {"Day", "Month", "Year"}} ] &] // TableForm – tomd

2

Một thay thế cho Belisarius' Phương pháp thứ hai:

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

Có, tôi thích DateList :-) – tomd

Các vấn đề liên quan