我正在使用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,
}
导入数据时如何格式化标题行?
答案 0 :(得分: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>