Python: 如何将SpatiaLite表转换为包含日期时间格式的numpy recarray?

2 投票
2 回答
644 浏览
提问于 2025-04-17 04:15

我在QGIS用户论坛上发了这个问题,但可能太技术性了,所以我也想在这里试试。

我的计划是制作一个QGIS插件,能够读取和绘制与矢量图层中选定点对应的时间序列数据(这些点代表不同的测量站,我需要快速查看每个测量站的时间序列,有时还需要在同一个图中显示多个测量站的数据)。因此,我需要用Python从Spatialite表中读取时间序列数据,然后用Matplotlib来绘制:

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'。下面是打印出来的table2,我猜小写的u表示它是unicode而不是datetime?

打印table2

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 个回答

1

在这里,我要特别感谢Joe Kington的帮助,真是太感谢了!

下面是要插入到原始代码中的内容:

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...'的方式可能不是最优雅的解决方案,但这个方法确实有效!

2

基本上,你想要传入一个字符串。

Matplotlib有一些方便的功能,可以把日期字符串转换成它内部使用的日期时间格式。

你可以试试下面这种写法:

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

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

plot_dateplot是一样的,只不过它会自动把x轴的标签格式化成时间(比如小时、天、月等等)。

如果你更喜欢使用plot(或者bar等其他函数),那就像平常一样调用ax.plot(time, y, ...)或者ax.bar,然后再调用ax.xaxis_date()来设置日期标签。

撰写回答