0

我有一个 mysql 表,我想从中访问和提取数据。该表的结构如下所示:

| 身份证 | 日期戳 | 时间戳 | 血糖 | 碳水化合物| 胰岛素 |

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

注意:时间戳条目是使用 CURTIME() 生成 的NB2:请原谅这张可怕的桌子——我会发布一张图片,但还没有足够的代表点来这样做:(

我正在尝试提取时间戳和血糖值以绘制时间序列:x 轴上的时间 (HH:MM) 和 y 轴上的血糖值。但是我遇到了一些问题...

问题:在 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

您将一堆时间戳存储为两个不相交的列,称为日期戳和时间戳。您没有告诉我们这些列的数据类型。(请记住,这TIMESTAMP是一个 MySQL 保留字,因此对于列名来说是一个非常糟糕的选择。)

此类数据的最佳实践是将日期和时间合并到一个类型为 的列中DATETIME。你可以称它为obstime(用于观察时间)或类似的东西。NOW()您可以使用该函数填充此字段。

如果此信息与多个医疗机构相关,您可能需要处理时区。但这是另一组问题。

您可以重写您的 MySQL 查询以将您的日期戳和时间戳列组合成一个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子句;连接的第二部分只产生一行。

因此,您可以像这样从一开始就按分钟获得观察列表。

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 *在程序中进行查询。当您向表中添加列时,它会使您的程序中断。

DATETIME另一个专业提示:在列中组合日期和时间。

第三个专业提示:我在您的表中没有看到任何 patient_id 或 Experiment_id 或任何此类内容。正如您设计的那样,它适用于一名患者和一系列观察。您可能希望使其更通用。这比为每个患者或实验添加另一个表要好得多。

于 2013-08-06T02:28:33.127 回答