将csv导入d3;can';t将字符串转换为数字

将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

我有一个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", " 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第一行中的空格。看看控制台输出。啊,见鬼,它毕竟是标题行。从中删除空间会使一切变得更好。谢谢你,汉利:)