2010-03-18 4 views
5

J'essaye de faire un tracé d'une série temporelle avec DateListPlot. Je veux le nourrir une série temporelle que j'obtiens à partir d'une base de données SQL. Lorsque je récupère la série chronologique, la liste est composée de SQLDateTime entrées que DateListPlot ne comprend pas.Comment extraire une date d'un objet SQLDateTime dans 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}}

ne fonctionne pas: In[25]:= DateListPlot[t]

DateListPlot nécessite un tuple Date et ne comprend pas SQLDATETIME. Que puis-je faire?

Répondre

7

La réponse:

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

Mathematica pense à tout de façon très similaire à l'intérieur. Ce que vous voyez comme {1, 2, 3} est actuellement List[1,2,3]. La fonction Part (notée [[...]]) fonctionne aussi bien sur n'importe quelle fonction, pas seulement List.

La façon rapide et sale pour appliquer dans votre cas:

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

Il pourrait être plus efficace et clair pour faire quelque chose comme/'SQLExecute [...]. SQLDateTime [l _]:> l' ou 'SQLExecute [...] /. SQLDateTime -> Identity' lorsque vous avez plusieurs colonnes d'objets 'SQLDateTime'. En outre, 'DateListPlot' comprend les timestamps Unix de style entier, de sorte que vous pouvez remplacer' SQLDateTime' par 'AbsoluteTime' pour les convertir, puisque' AbsoluteTime [{timespec ...}] 'vous donne un horodatage. –

+0

Ce sont d'excellentes réponses. Merci Jefromi et Michael! – andrewz

+0

Oui, je l'ai appelé vite et sale. L'utilisation d'une règle est nettement plus claire et plus efficace en termes de quantité de code. Je ne suis pas sûr si une règle est en général plus rapide, car elle doit chercher à travers tout, alors que si vous connaissez la structure de vos données, vous pouvez utiliser quelque chose comme ça qui n'a pas à examiner autre chose que les lieux vous savez que SQLDateTime se produit. – Cascabel