将csv导入d3;无法将字符串转换为数字

时间:2014-06-29 06:32:52

标签: 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", " 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。['温度']),但没有任何效果,当然d3不能使用字符串(或NaN) )作为数据,所以我需要以某种方式转换它。我尝试从CSV文件中手动删除空格(因此导入的字符串是" 16.8"而不是" 16.8")但这对...没有帮助... / p>

2 个答案:

答案 0 :(得分:1)

您应该使用访问器函数将字符串转换为日期和数字。这样做的方法是使用.row()方法,该方法迭代csv的行,并且对于每一行,允许您根据给定的数据提供将用于表示该行的输出对象。

提供给访问者的参数d表示单行或基准。在访问者函数中,d具有与您的数据列名称相对应的属性,例如TimeConditionsTemperature等...您可以操纵这些值在返回输出对象之前,所以在温度的情况下,您可以将输出对象的temperature属性指定为+d.Temperature,将其转换为数字。

按照惯例,属性名称是用JavaScript编写的,因此从访问者返回的对象应该使用驼峰键。

现在,当你的回调运行时,你的变量csv包含一个对象数组,每个对象都有timeconditionstemperature等属性。温度值已转换为数字。

以下是一个例子:

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.

答案 1 :(得分:0)

这对我有用。

d3.csv("weatherLog.csv", function(d) {
   return {
       temperature: +d.Temperature;
   }
}, function(error, csv) {
        if (error) return console.warn(error);
        console.log(csv);
});