Google Visualization API JSON vs ArrayToDataTable in Python

google visualization api json vs arraytodatatable in python, datatype nightmare

本文关键字:ArrayToDataTable in Python vs JSON Visualization API Google      更新时间:2023-09-26

起初我用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,这让我头疼。

正如布伦特·沃什伯恩在将python sql列表转换为字典中发布的那样,我相应地创建了我的字典

结果示例:

[{'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()

我得到的结果与数组到数据表相似:

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

令人惊讶的是,javascript 不再喜欢字符串了,并且错误地击中了我:

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

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

为什么它不再喜欢字符串日期(以任何形式),就像数组到数据表一样?或者我该如何解决问题?

另一个不眠之夜引导我 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 字符串

感谢大家的帮助!