0

アクセスしてデータを抽出したい mysql テーブルがあります。テーブルは次のように構成されています。

| | ID | 日付スタンプ | タイムスタンプ | 血糖 | 炭水化物 | インスリン |

| | 1 | 2013-08-05 | 18:28:17 | 6.7 | 76 | 6.6 |

NB:タイムスタンプ エントリは CURTIME() を使用して生成さ ます。

X 軸に時間 (HH:MM)、Y 軸に BloodSugar-value を使用して時系列をプロットするために、タイムスタンプと BloodSugar 値を抽出しようとしています。しかし、私はいくつかの問題に遭遇しています...

問題: Python でデータをリストにフェッチすると、タイムスタンプが datetime.timedelta(0, 58753) エントリとして表示されます。これらに対してデータをプロットできるように、これらを HH:MM にします。

質問: timedelta を HH:MM 形式に単純に再フォーマットする方法はありますか? これが不可能な場合は、これを回避する方法を教えてください (たとえば、mysqldb で別のフェッチ手法を使用するか、CURTIME() を別のものに置き換えるなど)。

免責事項:私は初心者で、学びたいと思っているので、できるだけ説明してください。ありがとう!!

コード:

import MySQLdb as mdb
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import dates
import datetime

con = mdb.connect('localhost', 'testuser', 'test623', 'test');
with con:
    cur = con.cursor()
    #importing data into a list for analysis
    cur.execute("SELECT * FROM Diabetes")

    rows = cur.fetchall()

    data = []
    for row in rows:
        data.append(row)

    A = data

    d = [a[1] for a in A]
    t = [a[2] for a in A]
    b = [a[3] for a in A]
    c = [a[4] for a in A]
    novo = [a[5] for a in A] 

    #here is my attempt at trying to reformat the time-entries... But doesn't work..
    formatted_time = []    
    for delta_time in t:
        hours, remainder = divmod(delta_time[1], 3600)  
        minutes, seconds = divmod(remainder, 60)   

        duration_formatted = '%s:%s:%s' % (hours, minutes, seconds)
        formatted_time.append(duration_formatted)
print formatted_time


fig, ax = plt.subplots()
ax.plot_date(t, b)
fig.autofmt_xdate()
plt.show()
4

1 に答える 1

0

日付スタンプとタイムスタンプと呼ばれる 2 つのばらばらの列として保存されている一連のタイムスタンプがあります。それらの列のデータ型を教えてくれませんでした。(これTIMESTAMPは MySQL の予約語であるため、列名としてはあまり適していないことに注意してください。)

この種のデータのベスト プラクティスは、日付と時刻を type の 1 つの列に結合することですDATETIME。obstime (観測時間) などと呼ぶこともできます。このフィールドにNOW()関数を入力できます。

この情報が複数の医療施設に関連する場合は、タイムゾーンに対処することをお勧めします。しかし、それは別の一連の質問です。

MySQL クエリを書き直して、日付スタンプ列とタイムスタンプ列を 1 つのDATETIME列に結合できます。DATETIMEこれを試して、テーブルから値を取得してください

  SELECT id, bloodsugar, carbohydrates, insuline,
         CAST(CONCAT(`datestamp`, ' ', `timestamp`) AS DATETIME) obstime
    FROM Diabetes
   ORDER BY id

あなたの質問から、どの hh:mm 情報が必要かわかりません。最初の測定からの経過時間を hh:mm で表示しますか? このようなグラフを作成している場合は、最初の測定以降の観測値を hh:mm:ss で表示する必要があるかもしれません。これを解決しましょう。

このクエリは、最初の測定値、つまり最初の時間を提供します。

    SELECT MIN(CAST(CONCAT(`datestamp`, ' ', `timestamp`) AS DATETIME)) firstobstime
      FROM Diabetes

そのクエリを他のクエリに結合できます。

   ...
  FROM Diabetes AS d
  JOIN (
    SELECT MIN(CAST(CONCAT(`datestamp`, ' ', `timestamp`) AS DATETIME)) firstobstime
      FROM Diabetes
  ) AS f

ONこの結合には句は必要ありません。結合の 2 番目の部分では、1 行しか生成されません。

すると、このように最初から分単位で観測のリストを取得できます。

SELECT TIMEDIFF(CAST(CONCAT(d.`datestamp`, ' ', d.`timestamp`) AS DATETIME),
                d.firstobstime) AS obstimeoffset
         d.bloodsugar, d.carbohydrates, d.insuline
  FROM Diabetes AS d
  JOIN (
    SELECT MIN(CAST(CONCAT(`datestamp`, ' ', `timestamp`) AS DATETIME)) firstobstime
      FROM Diabetes
       ) AS f        
 ORDER BY obstimeoffset

それがあなたの望みだと思います。

プロのヒント:SELECT *プログラム内のクエリでは避けてください。テーブルに列を追加すると、プログラムが壊れます。

もう 1 つのプロのヒント: 日付と時刻をDATETIME列に組み合わせます。

3 番目のプロのヒント: 患者 ID や実験 ID などはテーブルに表示されません。あなたが設計したように、それは 1 人の患者と 1 つの一連の観察に適しています。より一般的なものにしたい場合があります。これは、患者ごとまたは実験ごとに別のテーブルを追加するよりもはるかに優れたアプローチです。

于 2013-08-06T02:28:33.127 に答える