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が「date_time」を受け入れないため、正しいデータ型を取得できないようです。印刷テーブル2を以下に示します。小さなuは、それがUnicodeであり、日時ではないことを示していると思いますか?

表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代わりに(orbarなど) を使用する場合は、通常どおり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 に答える