2010-03-18 22 views
5

bir SQLDateTime nesnesinden bir tarih ayıklamak nasıl DateListPlot ile bir zaman dizisi bir çizim yapmaya çalışıyorum. Bir SQL veritabanından aldığım bir zaman serisini beslemek istiyorum. Zaman serisini aldığımda, liste DateListPlot'un anlamadığı SQLDateTime girişlerinden oluşur. 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}}

Çalışmaz: In[25]:= DateListPlot[t]

DateListPlot bir tarihi tuple gerektirir ve SqlDateTime anlamıyor. Ne yapabilirim?

cevap

7

cevap:

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

Mathematica çok benzer şekilde içten her şeyi düşünür. {1, 2, 3} olarak gördüğünüz aslında List[1,2,3]. Parça işlevi ([[...]] ile gösterilir) sadece List değil, herhangi bir işlevde de çalışır.

sizin durumunuzda bu uygulamaya hızlı ve kirli yolu:

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

O 'SQLExecute [...]/'böyle bir şey yapmak daha verimli ve net olabilir. SQLDateTime [l _]:> l' veya 'SQLExecute [...] /. SQLDateTime nesnelerinin birden çok sütununa sahip olduğunuzda SQLDateTime -> Identity '. Ayrıca, "DateListPlot", tamsayı Unix tarzı zaman damgalarını anlar, böylece 'AbsoluteTime' ile 'SQLDateTime', 'AbsoluteTime' ile değiştirebilir, çünkü 'AbsoluteTime [{timespec ...}] 'size bir zaman damgası verir. –

+0

Bunlar mükemmel cevaplardır. Teşekkürler Jefromi ve Michael! – andrewz

+0

Evet, hızlı ve kirli dedim. Bir kural kullanmak kesinlikle daha net ve kod miktarı açısından daha verimlidir. Genelde daha hızlı bir kural olup olmadığından emin değilim, çünkü her şeyi araştırması gerektiğinden, verilerinizin yapısını biliyorsanız, bu gibi bir şeyi kullanabilirsiniz. SQLDateTime'ın oluştuğunu biliyorsunuz. – Cascabel

İlgili konular