我正在尝试根据以下两个变量cx(应该是一年中的那一天)和cy(应该是小时+分钟/ 60)分割日期时间:
<!-- date format of d.date: 24-8-2016 9:47:38-->
var parseDayinYearFormat = d3.time.format('%j').parse;
var parseHourFormat = d3.time.format('%H').parse;
var parseMinuteFormat = d3.time.format('%M').parse;
<!-- add the objects-->
var circles = svg.selectAll("circle")
.data(data)
.enter()
.append("circle");
var circleAttributes = circles
.attr("cx", function (d) { return +parseDayinYearFormat(d.date); })
.attr("cy", function (d) { return +parseHourFormat(d.date)+(parseMinuteFormat(d.date)/60); })
.attr("r", function (d) { return 20.0/(9-d.total); })
.attr("class", function (d) {if (d.w>d.total-d.w) {return "cr"} else { return "cb" }});
但是d3不是很好玩:cx和cy成为NaN而d3给出错误Uncaught TypeError:n.apply不是函数
请帮忙。
答案 0 :(得分:2)
您需要使用单个格式对象解析整个字符串。您无法使用一系列解析来解析字符串。
使用d3 version 3.x documentation我提出了以下内容,这适用于您的示例。
var datestring = '24-8-2016 9:47:38';
var format = d3.time.format('%-d-%-m-%Y %-H:%-M:%-S');
console.log(format.parse(datestring))
// "2016-08-24T13:47:38.000Z" // (my time zone is UTC-4)
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
请注意,因为您的示例24-8-2016 9:47:38
有许多字段没有显示零填充,所以我在%
和说明符之间使用短划线,即%-d
,告诉d3一开始可能没有零。
另请注意,在您的示例中,无法 24
是一年中的一天,介于1到366之间:24显然只是<强>月,对吧?
但是,从您的代码段中可以看出,您只想从字符串中提取日期,小时和分钟。出于这个简单的目的,d3.time.format
可能有点矫枉过正,因为它会为您提供一个Date对象,然后您必须解析它以提取日/小时/分钟。考虑使用正则表达式执行此任务。