2010-03-18 40 views
5

Tôi đang cố gắng làm một âm mưu của một chuỗi thời gian với DateListPlot. Tôi muốn cho nó một chuỗi thời gian mà tôi có được từ một cơ sở dữ liệu SQL. Khi tôi truy xuất chuỗi thời gian, danh sách bao gồm các mục nhập SQLDateTimeDateListPlot không hiểu.Làm thế nào để trích xuất một ngày từ một đối tượng SQLDateTime trong Mathematica

In[24]:= t=SQLExecute[conn, "select timestamp,value from timeseries order by timestamp asc"]

Out[24]={{SQLDateTime[{2010,1,1}],12.3},{SQLDateTime[{2010,1,2}],12.51}}

Không làm việc: In[25]:= DateListPlot[t]

DateListPlot đòi hỏi một ngày tuple và không hiểu SQLDateTime. Tôi có thể làm gì?

Trả lời

7

Câu trả lời:

In[1]:= SQLDateTime[{2001, 5, 7}][[1]] 
Out[1]:= {2001,5,7} 

Mathematica nghĩ về tất cả mọi thứ rất tương tự trong nội bộ. Những gì bạn thấy là {1, 2, 3} thực sự là List[1,2,3]. Chức năng Phần (được biểu thị bằng [[...]]) hoạt động tốt trên mọi chức năng, không chỉ là List.

Cách nhanh chóng và dơ bẩn để áp dụng điều này trong trường hợp của bạn:

{#[[1,1]],#[[2]]}& /@ SQLExecute[...] 
+3

Nó có thể là hiệu quả hơn và rõ ràng để làm một cái gì đó như 'SQLExecute [...] /. SQLDateTime [l _]:> l' hoặc 'SQLExecute [...] /. SQLDateTime -> Identity' khi bạn có nhiều cột của các đối tượng 'SQLDateTime'. Ngoài ra, 'DateListPlot' hiểu dấu thời gian kiểu số nguyên Unix, vì vậy bạn có thể thay thế' SQLDateTime' bằng 'AbsoluteTime' để chuyển đổi thành những từ, vì' AbsoluteTime [{timespec ...}] 'cung cấp cho bạn một dấu thời gian. –

+0

Đây là những câu trả lời tuyệt vời. Cảm ơn Jefromi và Michael! – andrewz

+0

Vâng, tôi đã gọi nó nhanh và bẩn. Sử dụng quy tắc chắc chắn rõ ràng hơn và hiệu quả hơn về số lượng mã. Tuy nhiên, tôi không chắc liệu quy tắc có nhanh hơn hay không, bởi vì nó phải tìm kiếm thông qua mọi thứ, trong khi nếu bạn biết cấu trúc dữ liệu của mình, bạn có thể sử dụng một thứ như thế này mà không phải kiểm tra gì ngoại trừ các địa điểm bạn biết SQLDateTime xảy ra. – Cascabel

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