Импорт csv в d3; не удается преобразовать строки в числа

#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", " 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»), но это тоже не помогло…

Ответ №1:

Вы должны использовать функцию доступа для преобразования строк в даты и числа. Способ сделать это — использовать .row() метод, который перебирает строки вашего csv и для каждой строки позволяет вам предоставить выходной объект, который будет использоваться для представления этой строки на основе заданных данных.

Параметр, заданный для средства доступа, d , представляет собой одну строку или элемент данных. В функции доступа d имеет свойства, соответствующие именам ваших столбцов данных, такие как Time , Conditions , Temperature , и т.д… Вы можете манипулировать этими значениями, прежде чем возвращать свой выходной объект, поэтому в случае температуры вы можете присвоить temperature свойству вашего выходного объекта значение be d.Temperature , которое преобразует его в число.

По соглашению, имена свойств в JavaScript имеют верблюжью оболочку, поэтому объект, который вы возвращаете из средства доступа, должен использовать ключи в верблюжьей оболочке.

Теперь, когда выполняется ваш обратный вызов, ваша переменная csv содержит массив объектов, каждый из которых имеет такие свойства, как time , conditions , temperature , и т. Д., А значения температуры были преобразованы в числа.

Вот пример:

 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. Это работает потрясающе, за исключением того, что я получаю «Температура в 7:00 вечера была NaN градусов». в качестве вывода. Это происходит для всех числовых значений, а не только для температуры.

2. А, я вижу, что происходит… У вас неправильно сформированный CSV-файл. Пробелы считаются частью имени поля, поэтому, если у вас есть начальный пробел, за которым следует двойная кавычка, как в значениях для Conditions , тогда кавычка будет интерпретироваться как часть поля. Проверьте эту проблему на странице GitHub d3.

3. Если вы удалите пробелы из первой строки вашего файла .csv, вы, по крайней мере, разрешите определять значения, и вы не получите NaN. Вот Plnkr , где все, что я сделал, это удалил пробелы в первой строке csv. Посмотрите на вывод консоли.

4. Ах, черт, в конце концов, это была строка заголовка. Удаление пробелов из этого делает все лучше. Спасибо jshanley 🙂

Ответ №2:

Это сработало для меня.

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

Комментарии:

1. У меня это не работало, пока я не удалил; из after d . Температура. И даже после этого он все еще выдает мне ‘temperature = NaN’… Пробовал с помощью ‘parseInt’, но по-прежнему ничего…