将csv导入d3;can';t将字符串转换为数字
我有一个csv文件,数据如下:将csv导入d3;can';t将字符串转换为数字,csv,d3.js,Csv,D3.js,我有一个csv文件,数据如下: Time, Conditions, Temperature, Humidity, WindDir, WindDeg, U1, Pressure, U2, U3, U4, U4, UV, U5, MoonPercent, SunriseHr, SunriseMin, SunsetHr "2014/06/19 19:00:00", "Clear", 16.8, "87%", "North", 355, 8.0, "1010", "11", 15, "NA", "1.2
Time, Conditions, Temperature, Humidity, WindDir, WindDeg, U1, Pressure, U2, U3, U4, U4, UV, U5, MoonPercent, SunriseHr, SunriseMin, SunsetHr
"2014/06/19 19:00:00", "Clear", 16.8, "87%", "North", 355, 8.0, "1010", "11", 15, "NA", "1.2", " 0", "11", "47", "5", "03" "22", "07"
"2014/06/19 19:31:01", "Mostly Cloudy", 17.2, "86%", "NNE", 26, 12.9, "1010", "11", 15, "NA", "0.7", " 0", "11", "47", "5", "03" "22", "07"
"2014/06/19 19:40:00", "Mostly Cloudy", 17.4, "85%", "ENE", 68, 6.4, "1010", "11", 15, "NA", "0.7", " 0", "11", "47", "5", "03" "22", "07"
我想导入它,让数组以数字的形式包含数字,而不是像最初那样以字符串的形式包含数字:
Object { Time="2014/06/19 19:00:00", Conditions=" "Clear"", Temperature=" 16.8", more...}
问题是,无论我怎么做,我都无法将数字转换为实际数字,只是NaN。这是我的输入代码:
d3.csv("weatherLog.csv", function(error, csv) {
if (error) return console.warn(error);
csv.forEach(function(d){ (d['Temperature'] = +d['Temperature']); });
console.log(csv);
我尝试了d.Temperature,我尝试了parseInt(d.[Temperature']),但是没有任何效果,当然d3不能使用字符串(或NaN)作为数据,所以我需要先转换它。我尝试手动从CSV文件中删除空间(因此导入的字符串是“16.8”而不是“16.8”),但这也没有帮助…这对我很有效
d3.csv("weatherLog.csv", function(d) {
return {
temperature: +d.Temperature;
}
}, function(error, csv) {
if (error) return console.warn(error);
console.log(csv);
});
应该使用访问器函数将字符串转换为日期和数字。方法是使用
.row()
方法,该方法在csv的行上进行迭代,并为每一行提供一个输出对象,该对象将用于基于给定数据表示该行
给定给访问器的参数d
,表示一行或一个数据。在访问器函数中,d
具有与数据列名称对应的属性,例如时间
、条件
、温度
等。。。您可以在返回输出对象之前操纵这些值,因此在温度的情况下,您可以将输出对象的温度
属性指定为+d.temperature
,将其转换为数字
按照惯例,属性名在JavaScript中是以驼峰大小写的,因此从访问器返回的对象应该使用驼峰大小写的键
现在,当回调运行时,变量csv
包含一个对象数组,每个对象都有属性,例如时间
,条件
,温度
,等等。。。温度值已转换为数字
以下是一个例子:
d3.csv('weatherLog.csv')
.row(function(d) {
// for each row of the data, create an object with these properties...
return {
time: d3.time.format('%Y/%m/%d %H:%M:%S').parse(d.Time),
conditions: d.Conditions,
temperature: +d.Temperature,
humidity: d.Humidity,
windDir: d.WindDir,
windDeg: +d.WindDeg,
pressure: +d.Pressure
};
})
.get(function(error, csv) {
if (!error) {
// lets say you want to log all the temperatures to the console
csv.forEach(function(d,i) {
var theTime = d3.time.format('%I:%M %p')(d.time);
console.log('The temperature at', theTime, 'was', d.temperature, 'degrees.');
});
} else {
// handle error
}
});
这将向控制台输出以下内容:
The temperature at 7:00 PM was 16.8 degrees.
The temperature at 7:31 PM was 17.2 degrees.
The temperature at 7:40 PM was 17.4 degrees.
这对我来说不起作用,直到我移除了;从+d温度开始。即使在那之后,它仍然给我“温度=NaN”。。。尝试使用“parseInt”,但仍然没有任何效果…这非常有效,除了我得到的输出“晚上7:00的温度是南安度”。这发生在所有数值上,不仅仅是温度。啊,我知道发生了什么。。。您的.csv文件格式不正确。空格被视为字段名的一部分,因此如果前导空格后跟双引号,如
条件的值中所示,则引号将被解释为字段的一部分。查看D3Github页面。如果从.csv的第一行中删除空格,则至少允许定义值,而不会得到NaN。在这里,我所做的就是删除csv第一行中的空格。看看控制台输出。啊,见鬼,它毕竟是标题行。从中删除空间会使一切变得更好。谢谢你,汉利:)