Python: таблица SpatiaLite для повторного массива с форматом даты и времени? - PullRequest
2 голосов
/ 13 октября 2011

Я разместил этот вопрос на форуме пользователей QGIS , но он может быть слишком техническим, поэтому я рискну и попробую здесь.

Мой план состоит в том, чтобы иметь плагин QGIS, который считывает и отображает данные временных рядов, соответствующие выбранным точкам в векторном слое (точки представляют разные измерительные станции, и мне нужно быстро просматривать временные ряды на каждой из них, иногда несколько станций на одном участке). Следовательно, мне нужен Python для чтения данных временных рядов из таблицы Spatialite, а затем для их построения с помощью Matplotlib.plot:

from pyspatialite import dbapi2 as sqlite 
import numpy as np
import matplotlib.pyplot as plt  
import datetime

MyPath = r"C:\DATA\DBTEST\MyTestDb.sqlite"
conn = sqlite.connect(MyPath,detect_types=sqlite.PARSE_DECLTYPES|sqlite.PARSE_COLNAMES)
curs = conn.cursor()

sql = r"""SELECT Date as 'date [datetime]', Level_masl FROM MyTable"""
rs = curs.execute(sql)
recs = rs.fetchall()

My_format = [('date_time', datetime.datetime), ('values', float)]
table = np.array(recs, dtype=My_format)
table2=table.view(np.recarray)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(table2.date_time, table2.values, 'o-')
....

Но похоже, что я не получаю правильные типы данных, так как matplotlib не принимает мое date_time. Таблица печати 2 показана ниже, я думаю, что маленькая буква u указывает на то, что это Unicode, а не datetime?

печать таблицы2

recarray ([(u'2011-04-20 09:42:00 ', 703.46000000000004), (u'2011-04-20 09:43:00 ', 705.35000000000002), ... dtype = [('date_time', '| O4'), ('values', '

Я не программист и абсолютно полный новичок в Python и Spatialite, поэтому любая помощь будет очень цениться!

/ JK

Ответы [ 2 ]

2 голосов
/ 13 октября 2011

По сути, вы пытаетесь передать строку.

Matplotlib имеет несколько вспомогательных функций для преобразования строк даты в ее (внутреннее) представление даты и времени.

Попробуйте что-то похожее на:

...
from matplotlib.dates import datestr2num
...

...
time = datestr2num(table2.date_time)
ax.plot_date(time, table2.values, 'o-')
...

plot_date - это то же самое, что и plot, он просто автоматически форматирует ось X, чтобы иметь метки времени (например, час, день, месяц и т. Д.).

Если вы предпочитаете использовать plot (или bar и т. Д.) Вместо этого, просто позвоните ax.plot(time, y, ...) или ax.bar как обычно, а затем позвоните ax.xaxis_date(), чтобы настроить метки даты.

1 голос
/ 18 октября 2011

Решено с лучшей помощью от Джо Кингтона, большое спасибо!

Вставить в оригинальный код вопроса:

myTimestring = []  
i = 0
for row in table2: 
    myTimestring.append(table2.date_time[i])
    i = i + 1
numtime=datestr2num(myTimestring)
...
ax.plot_date(numtime, table2.values, 'o-')

Скорее всего, есть более элегантные решения, чем «для строки в... но это работает!

...