2010-03-18 62 views
5

我正在嘗試使用DateListPlot做一個時間序列圖。我想給它提供一個從SQL數據庫中獲得的時間序列。當我檢索時間序列時,該列表由SQLDateTime條目組成,DateListPlot不理解。如何在Mathematica中從SQLDateTime對象提取日期

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}}

不起作用: In[25]:= DateListPlot[t]

DateListPlot需要一個日期數組和不理解SQLDATETIME。我能做什麼?

回答

7

答案:

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

數學認爲一切都非常相似的內部。你看到的{1, 2, 3}實際上是List[1,2,3]。零件功能(用[[...]]表示)在任何功能上都能正常工作,而不僅僅是List

快速和骯髒的方式在你的情況下應用此:

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

這可能是更有效和更清晰的做類似的東西'SQLExecute [...] /。 SQLDateTime [l _]:> l'或'SQLExecute [...] /。 SQLDateTime - > Identity',當你有多個SQLDateTime對象時。另外,'DateListPlot'理解整型Unix樣式的時間戳,因此''AbsoluteTime [{timespec ...}]'給你一個時間戳,所以你可以用'AbsoluteTime'替換'SQLDateTime'來轉換爲那些。 – 2010-03-18 16:46:47

+0

這些都是很好的答案。感謝Jefromi和Michael! – andrewz 2010-03-18 16:59:44

+0

是的,我確實叫它快速和骯髒。使用規則肯定更清晰,代碼量更高效。不過,我不確定規則是否總體上更快,因爲它必須搜索所有內容,而如果您知道數據的結構,則可以使用類似這樣的東西,除了地點之外不需要檢查任何東西你知道SQLDateTime發生。 – Cascabel 2010-03-18 17:00:23