如何更改列表中项目的格式?

时间:2017-05-03 10:45:10

标签: python python-2.7 google-visualization

我尝试使用谷歌图表,谷歌图表中的数据格式就像[new Date(2015, 1, 1), 5], [new Date(2015, 1, 2), 7], [new Date(2015, 1, 3), 3]

澄清(这是我在谷歌图表中找到的 文档(https://developers.google.com/chart/interactive/docs/datesandtimes#dates-and-times-using-the-date-string-representation))基于答案的是,这种格式[new Date(2015, 0, 2), 7],可能会改变吗?:

function drawChart() {

    var data = new google.visualization.DataTable();
    data.addColumn('date', 'Time of Day');
    data.addColumn('number', 'Rating');

    data.addRows([
      [new Date(2015, 0, 1), 5],  [new Date(2015, 0, 2), 7],  [new Date(2015, 0, 3), 3],
      [new Date(2015, 0, 4), 1],  [new Date(2015, 0, 5), 3],  [new Date(2015, 0, 6), 4],
      [new Date(2015, 0, 7), 3],  [new Date(2015, 0, 8), 4],  [new Date(2015, 0, 9), 2],
      [new Date(2015, 0, 10), 5], [new Date(2015, 0, 11), 8], [new Date(2015, 0, 12), 6],
      [new Date(2015, 0, 13), 3], [new Date(2015, 0, 14), 3], [new Date(2015, 0, 15), 5],
      [new Date(2015, 0, 16), 7], [new Date(2015, 0, 17), 6], [new Date(2015, 0, 18), 6],
      [new Date(2015, 0, 19), 3], [new Date(2015, 0, 20), 1], [new Date(2015, 0, 21), 2],
      [new Date(2015, 0, 22), 4], [new Date(2015, 0, 23), 6], [new Date(2015, 0, 24), 5],
      [new Date(2015, 0, 25), 9], [new Date(2015, 0, 26), 4], [new Date(2015, 0, 27), 9],
      [new Date(2015, 0, 28), 8], [new Date(2015, 0, 29), 6], [new Date(2015, 0, 30), 4],
      [new Date(2015, 0, 31), 6], [new Date(2015, 1, 1), 7],  [new Date(2015, 1, 2), 9]
    ]);

我的原始数据如下:

x = ['1/4/2014', '2/4/2014','3/4/2014']
z = [100,200,300]

所以我尝试了一些代码:

y=[]
for i in x:
    lastconnection = datetime.strptime(i,"%d/%m/%Y").strftime('%Y,%m,%d')
    y.append((lastconnection))
time = map(lambda x,y:(x,y),y,z)

打印时间 输出是:

[('2014,04,01', 100), ('2014,04,02', 200), ('2014,04,03', 300)]

问题我不知道如何添加新的Date()'并将日期放入括号中而不带引号。 Anyidea ??提前谢谢!

3 个答案:

答案 0 :(得分:1)

1)以下是Google将接受日期的唯一字符串格式...

"Date(Year, Month, Day, Hours, Minutes, Seconds, Milliseconds)"

e.g。

"Date(2017, 4, 3, 7, 31, 49, 0)"  // <-- 05/03/2017 07:31:49

注意:上面的字符串必须将月份减少一个

并非所有参数都是必需的,这也可以...

"Date(2017, 4, 3)"  // <-- 05/03/2017 12:00:00

2)但是,此格式仅在using json to build the DataTable

时由Google接受

这意味着数据不能在一个简单的数组中......

[["Date(2017, 4, 3)", 100]]  // <-- will not work

必须格式如下......

{
  "cols": [
    {"label": "x", "type": "date"},
    {"label": "z", "type": "number"},
  ],
  "rows": [
    {"c":[{"v": "Date(2017, 4, 3)"}, {"v": 100}]}
  ]
}

有关使用json字符串加载数据表的示例,请参阅以下工作代码段...

google.charts.load('current', {
  callback: function () {
    var formatDate = new google.visualization.DateFormat({
      pattern: 'MM/dd/yyyy hh:mm:ss'
    });

    var jsonStr = '{"cols": [{"label": "Date", "type": "date"}],"rows": [{"c":[{"v": "Date(2017, 4, 3)"}]}]}';

    var data = new google.visualization.DataTable(jsonStr);

    formatDate.format(data, 0);

    var container = document.getElementById('chart_div');
    var chart = new google.visualization.Table(container);
    chart.draw(data);
  },
  packages:['table']
});
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="chart_div"></div>

3)如果您不使用上述json格式...

您必须以某种方式按摩客户端上的数据

您可以使用arrayToDataTableDataView

允许您以当前格式保留日期......

 [['1/4/2014', 100], ['2/4/2014', 200], ['3/4/2014', 300]]

在这种方法中,您将按原样构建数据表,然后使用数据视图转换...

var simpleArr = [['1/4/2014', 100], ['2/4/2014', 200], ['3/4/2014', 300]];

var data = new google.visualization.arrayToDataTable(simpleArr, true); // <-- true = no column headings

var view = new google.visualization.DataView(data);
view.setColumns([
  // convert date column
  {
    calc: function (dt, row) {
      return {
        v: new Date(dt.getValue(row, 0)),
        f: formatDate.formatValue(new Date(dt.getValue(row, 0)))  // <-- formatted value, optional
      }
    },
    label: data.getColumnLabel(0),
    type: 'date'
  },
  // second column requires no manipulation, just use index, instead of calc object
  1
]);

请参阅以下工作代码段...

google.charts.load('current', {
  callback: function () {
    var formatDate = new google.visualization.DateFormat({
      pattern: 'MM/dd/yyyy hh:mm:ss'
    });

    var simpleArr = [['1/4/2014', 100], ['2/4/2014', 200], ['3/4/2014', 300]];

    var data = new google.visualization.arrayToDataTable(simpleArr, true); // <-- true = no column headings

    var view = new google.visualization.DataView(data);
    view.setColumns([
      // convert date column
      {
        calc: function (dt, row) {
          return {
            v: new Date(dt.getValue(row, 0)),
            f: formatDate.formatValue(new Date(dt.getValue(row, 0)))  // <-- formatted value, optional
          }
        },
        label: data.getColumnLabel(0),
        type: 'date'
      },
      // second column requires no manipulation, just use index, instead of calc object
      1
    ]);

    var container = document.getElementById('chart_div');
    var chart = new google.visualization.Table(container);
    chart.draw(data);
  },
  packages:['table']
});
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="chart_div"></div>

答案 1 :(得分:0)

如果要生成要在浏览器中加载到Google图表中的JSON数据,请不要使用new Date(..)语法;那个JavaScript代码而不是JSON兼容。

相反,请使用supported string notation

  

使用JavaScript DataTable对象文字序列化数据时   构建DataTable的表示法,new Date()构造函数不能   用过的。相反,Google Charts提供了日期字符串表示形式   这样可以正确地序列化和解析您的datedatetime   在创建DataTable时。这个Date字符串格式简单地删除了   new关键字并将其余表达式包装在引号中:

"Date(Year, Month, Day, Hours, Minutes, Seconds, Milliseconds)"

不建议传递是一个字符串(不同的浏览器以不同方式解析这些),因此传递数值并从月中减去一个,因为Javascript使用从零开始的月值:< / p>

date = datetime.strptime(i, "%d/%m/%Y")
lastconnection = 'Date({}, {}, {})'.format(date.year, date.month - 1, date.day)

然后产生:

[("Date(2014, 3, 1)", 100), ("Date(2014, 3, 2')", 200), ("Date(2014, 3, 3)", 300)]

然后,Google图表库会通过评估前缀为Date()的字符串将其转换为实际new个对象:

eval("new Date(2014, 3, 1)")
Tue Apr 01 2014 00:00:00 GMT+0100 (BST)

请注意,此格式仅在DataTable object literal notation

中受支持

Google提供了一个Python library来轻松实现这一目标。生产,但不幸的是,该项目不能从PyPI安装(所以你必须从GitHub tarbal安装)而且更烦人,不支持Python 3.项目看起来相当死,没有代码更改4年来,两次拉扯请求在藤蔓上萎缩。

答案 2 :(得分:-1)

你有一个小问题 - new Date()只能是python中的一个字符串。 如果您想尽快解决此问题 - 您可以使用:

>>> a = 'new Date(1,2,3)'
>>> c = [[a, i] for i in xrange(100,103)]
>>> c
[['new Date(1,2,3)', 100], ['new Date(1,2,3)', 101], ['new Date(1,2,3)', 102]]
>>> c = str(c)
>>> c.replace("'", '')
'[[new Date(1,2,3), 100], [new Date(1,2,3), 101], [new Date(1,2,3), 102]]'

您可以将日期保存为'new Date({0},{1},{2})'.format(...)的字符串,并将其用作子列表的第1项。然后将此列表转换为字符串并删除所有引号。

Bur我建议您查看您的代码。也许你会找到一个更好的方法来解决问题(可能是JS或smth)。