【问题标题】:google visualization api json vs arraytodatatable in python, datatype nightmare谷歌可视化api json与python中的arraytodatatable,数据类型噩梦
【发布时间】:2015-01-15 22:10:18
【问题描述】:

起初我用python创建了简单的静态谷歌可视化页面

python 中的源代码:

def print_graph_script(temp_table):

    # google chart snippet
    chart_code="""
    <script type="text/javascript" src="https://www.google.com/jsapi"></script>
    <script type="text/javascript">
      google.load("visualization", "1", {packages:["corechart"]});
      google.setOnLoadCallback(drawChart);
      function drawChart() {
        var data = google.visualization.arrayToDataTable([
          ['Time', 'Temperature', 'Low', 'High'],
%s
        ]);

        var options = {
          title: 'Temperature stats',
        };

        var chart = new google.visualization.LineChart(document.getElementById('temp_chart_div'));
        chart.draw(data, options);
      }
    </script>"""

    print chart_code % (temp_table)

并生成html:

  <script type="text/javascript">
      google.load("visualization", "1", {packages:["corechart"]});
      google.setOnLoadCallback(drawChart);
      function drawChart() {
        var data = google.visualization.arrayToDataTable([
          ['Time', 'Temperature', 'Low', 'High'],
['01.15.2015 22:23:53', 22.937, 20.0, 22.0],
['01.15.2015 23:23:43', 21.687, 20.0, 22.0]

        ]);

        var options = {
          title: 'Temperature stats',
        };

        var chart = new google.visualization.LineChart(document.getElementById('temp_chart_div'));
        chart.draw(data, options);
      }
    </script>

正如它所看到的,它工作正常并以“01.15.2015 23:23:43”格式传递时间戳,这对我来说就像一个字符串。

现在我尝试进化并迁移到 Json,这让我很头疼。

正如 Brent Washburne 在 convert python sql list into dictionary 中发布的那样,我相应地创建了我的字典

结果示例:

[{'timestamp': u'01.15.2015 23:54:12', 'temp': 21.375}]

现在,当我将它传递给 gviz_api 以将其转换为 json 时:

schema = {"timestamp": ("string", "timestamp"),"temp": ("number", "temp")}
data = temp_chart_table
# Loading it into gviz_api.DataTable
data_table = gviz_api.DataTable(schema)
data_table.LoadData(data)
json = data_table.ToJSon()

我得到与 arraytodatatable 类似的结果:

[{"v":"01.15.2015 23:59:42"}]}]

令人惊讶的是,javascript 不再喜欢字符串,并给我带来了错误:

轴 #0 的数据列不能是字符串类型

互联网上的信息很少,除了一些源代码。 正如https://developers.google.com/chart/interactive/docs/reference#DataTable 建议的那样,我尝试将“字符串”更改为“日期时间”,但后来我遇到了转换问题。

为什么它不再喜欢字符串日期(以任何形式),比如 arraytodatatable? 或者我该如何解决这个问题?

【问题讨论】:

  • 这里有 3 种不同的字符串格式来表示日期:'2015.01.15 23:54:12''01.15.2015 22:23:53'"15.01.2015 23:59:42"——据我所知,它们都不是标准化的时间格式。为什么不使用标准化的 iso 格式并完成它?
  • 我使用curs.execute("INSERT INTO data values (null, CURRENT_TIMESTAMP, (?), (?), (?), (?), (?), (?), (?), (?))", (temp,pinstatus,low_limit,high_limit,lightstatus,balstatus,vvstatus,svstatus)) 将时间戳插入数据库,据我了解,这应该是“最佳实践”。 strftime 让我将其转换为我的区域格式并添加缺少的 GMT 那是我的错误,因为您提到的这些格式被搞砸了,复制粘贴错误。所有这些都应该是“d.m.Y H:M:S”,但谷歌 API 会吃掉所有这些,无论它们是什么顺序。只有当我将它们作为数组传递时。

标签: javascript python json string datetime


【解决方案1】:

又一个不眠之夜将我引向https://docs.python.org/2/library/sqlite3.html 第 11.13.5.4 章。默认适配器和转换器

它在连接头中使用“detect_types”。

connection = sqlite3.connect(dbname,detect_types=sqlite3.PARSE_DECLTYPES)

显然,这就是您需要从数据库中获取旅游时间戳的格式:

datetime.datetime(2015, 1, 16, 10, 43, 54, 193266)

而不是 unicode 字符串,正如我原来的问题中提到的那样

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-18
    • 2010-10-17
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 2022-06-29
    • 2013-02-26
    • 1970-01-01
    相关资源
    最近更新 更多