【问题标题】:Parsing header row with dates when importing csv data导入 csv 数据时解析带有日期的标题行
【发布时间】:2019-11-14 16:00:38
【问题描述】:

我正在使用 d3 导入 CSV 文件以进行数据可视化。我的 CSV 文件有我需要转换为日期的标题行,以及需要转换为整数的数据:

ISBN,2019-08,2019-09,2019-10
9782749205465,107,488,218
9789423069313,95,87,186

我可以导入 CSV 文件并使用以下方法将数据解析为整数:

d3.csv("/assets/2019-20-download-stats.csv").then(function (data) {
  data.forEach(function(d) {
    d.ISBN = +d.ISBN;
    d['201908'] = +d['201908'];
    d['201909'] = +d['201909'];
    d['201910'] = +d['201910'];
  });
});

但标题行都是输出数组中的字符串,例如:

{
  "201908": 107,
  "201909": 488,
  "201910": 218,
  "ISBN": 9782749205465,
}

导入数据时如何格式化标题行?

【问题讨论】:

    标签: javascript csv datetime d3.js


    【解决方案1】:

    这几乎可以肯定是XY problem。我看不到任何情况下您的数据应该包含以日期为键的对象。最重要的是,请注意如果您将日期对象作为对象的键传递,JavaScript 会自动将您的日期对象转换为 字符串。如果您(无论出于何种原因)真的想要一个日期作为键,您应该使用Map

    话虽如此,这就是你应该做的:在行转换函数中(你的代码中没有),检查日期......

    if (!isNaN(new Date(key).getTime()))
    

    ...如果找到,请使用new Date 生成密钥:

    foo[new Date(key)] = +d[key]
    

    这是一个使用d3.csvParse 的演示(与您的d3.csv 完全相同):

    const csv = `ISBN,2019-08,2019-09,2019-10
    9782749205465,107,488,218
    9789423069313,95,87,186`;
    
    const data = d3.csvParse(csv, row);
    
    function row(d) {
      const newObject = {};
      for (var key in d) {
        if (!isNaN(new Date(key).getTime())) {
          newObject[new Date(key)] = +d[key]
        } else {
          newObject[key] = +d[key]
        }
      };
      return newObject;
    };
    
    console.log(data)
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 2023-03-11
      相关资源
      最近更新 更多