2

我在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 不接受我的“日期时间”。下面显示了一个打印表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'), ('值', '

我不是程序员,绝对是一个完整的 Python 和 Spatialite 初学者,所以非常感谢任何帮助!

/JK

4

2 回答 2

2

基本上,您正在尝试传入一个字符串。

Matplotlib 有几个方便的函数用于将日期字符串转换为它的(内部)日期时间表示。

尝试更多类似的东西:

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

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

plot_date与 相同plot,它只是自动将 x 轴格式化为具有时间(例如小时、日、月等)标签。

如果您更愿意使用plot(or bar, etc),只需像往常一样调用ax.plot(time, y, ...)or ,然后再调用以设置日期标签。ax.barax.xaxis_date()

于 2011-10-13T19:31:12.510 回答
1

在乔金顿的帮助下解决了,非常感谢!

插入有问题的原始代码:

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-')

肯定有比“for row in ...”更优雅的解决方案,但这有效!

于 2011-10-18T06:15:34.537 回答