2010-03-18 12 views
5

Sto provando a creare un grafico di una serie storica con DateListPlot. Voglio dargli da mangiare una serie temporale che ottengo da un database SQL. Quando recupero le serie temporali, la lista è composta da SQLDateTime voci che DateListPlot non comprendono.Come estrarre una data da un oggetto SQLDateTime in 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}}

non funziona: In[25]:= DateListPlot[t]

DateListPlot richiede una data tupla e non capisce SqlDateTime. Cosa posso fare?

risposta

7

La risposta:

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

Mathematica pensa di tutto ciò in modo molto simile internamente. Quello che vedi come {1, 2, 3} è in realtà List[1,2,3]. La funzione Part (indicata con [[...]]) funziona altrettanto bene su qualsiasi funzione, non solo su List.

Il modo più rapido e sporco per applicare questo nel tuo caso:

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

Potrebbe essere più efficiente e chiaro per fare qualcosa di simile SQLExecute [...]/'. SQLDateTime [l _]:> l' o 'SQLExecute [...] /. SQLDateTime -> Identity' quando ci sono più colonne di oggetti 'SQLDateTime'. Inoltre, 'DateListPlot' comprende interi timestamp in stile Unix, quindi è possibile sostituire' SQLDateTime' con 'AbsoluteTime' per convertirli in quelli, dato che' AbsoluteTime [{timespec ...}] 'fornisce un timestamp. –

+0

Queste sono ottime risposte. Grazie, Jefromi e Michael! – andrewz

+0

Sì, l'ho chiamato veloce e sporco. L'utilizzo di una regola è decisamente più chiaro e più efficiente in termini di quantità di codice. Non sono sicuro che una regola sia, in generale, più veloce, perché deve cercare in tutto, mentre se conosci la struttura dei tuoi dati, puoi usare qualcosa di simile che non deve esaminare altro che i luoghi sai che SQLDateTime si verifica. – Cascabel

Problemi correlati