2016-11-07 5 views
0

Ich habe ein Balkendiagramm in D3 und ich möchte auf der x-Achse einige Daten anzeigen. Ich erhalte aus der Datenbank zwei Felder, die ich verketten muss, um das Jahr und den Monat zu erhalten. Siehe unten. Die Idee ist, dass für das Feld d.date ich NaN bekomme, obwohl ich es in eine Zahl umgewandelt habe.D3: Konvertiere Daten in Nummer

data.forEach(function (d) { 
    d.date = "20" + d.yy + "/" + d.mm; 
    // coerce to number 
    d.value = +d.value; 
    d.date = +d.date; 
    console.log(d.value); 
    console.log(d.date); 
}); 

x.domain(data.map(function (d) { 
    console.log("HEelllppp!!!!",d.date); 
    return d.date; 
})); 

y.domain([0, d3.max(data, function (d) { 
    return d.value; 
})]); 

Wer mit ein paar Ideen? Danke im Voraus!

Antwort

1

Sie können eine Zeichenfolge in eine Zahl umwandeln unary plus mit:

console.log(+"12345") 
 
console.log(+true) 
 
console.log(+"17.9876")

aber Sie versuchen, eine Zeichenfolge mit einem Zeichen zu konvertieren, die nicht numerisch ist, wie „2016/02 ". Es wird NaN zurück:

console.log(+"2016/01") 
 
console.log(+"1a2b3c")

Lösung: eine Ordnungsskala für die Tage nutzen, so dass sie als Strings (faule Lösung) vorbei, oder analysiert die Daten unter Verwendung von D3 (vorzugsweise):

var dateString = "2016/04";//this is a string 
 
var format = d3.time.format("%Y/%m"); 
 
var date = format.parse(dateString);//this is a date 
 
var dateTick = format(date); 
 
console.log("date is: " + date) 
 
console.log("but you can show it as: " + dateTick)
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

+0

aber am Ende ich will es nur in diesem Format 2016/01. Wende ich einen anderen Filter oder etwas an? – blaa

+0

Wenn Sie über die Ticks sprechen, konvertieren Sie sie zuerst in ein * Datum * und verwenden dann 'tickFormat', um das Datum so anzuzeigen, wie Sie es möchten. Überprüfen Sie das letzte Snippet erneut. –

0

Statt Zahlen umzuwandeln, sollten Sie co nvert zu Daten:

var dates = data.map(function(d){ return new Date(d.yy + "/" + d.mm); }) 
var xScale = d3.time.scale().domain(d3.extent(dates)) 

Wenn ich var data = [ { yy: 2016, mm: 01}, {yy: 2016, mm: 02 }]; verwende ich die folgende aus den d3.min(xScale.domain()) erhalten:

Mon Feb 01 2016 00:00:00 GMT-0500 (EST) 
+0

Ich will einfach nur dieses Format 2016/01. Wie kann ich das bekommen? – blaa

+0

Sie können 'd3.time.format ("% Y /% m ")' verwenden, um Ihr Datum zu formatieren, z. 'd3.time.format ("% Y /% m ") (neues Datum (" 2016/01/03 "))' wird einfach '' 2016/01 "' zurückgeben. – mdml