d3.timeParse() 日期、月份和年份问题

Posted

技术标签:

【中文标题】d3.timeParse() 日期、月份和年份问题【英文标题】:d3.timeParse() Issue with date, month & year 【发布时间】:2022-01-13 15:51:33 【问题描述】:

我正在尝试为 eur/usd(y 轴)和时间(x 轴)创建 x 和 y 比例。 我试图修改我的 d3.timeParse() 以使其正常工作,但我遇到了问题。 我还添加了 JSON 数据外观的图像示例。 我试图将 timeParse() 输入与 JSON 日期数据匹配,但没有运气。 任何意见表示赞赏。

<!DOCTYPE html>
<html>

<head>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.1.1/d3.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <title>D3.js</title>
    <meta charset="UTF-8">
    <style type="text/css"></style>
</head>

<body>
    <script type="text/javascript"></script>
    <script>

        $.getJSON("https://jsonblob.com/api/904557502042226688", function (data) 
            console.log(data);
            plotCurrencyData(data);
        );

        // Executed once file has downloaded
        function plotCurrencyData(data)
            // SVG
            var margin = top:50, right: 50, bottom: 50, left: 50,
            width = 900 - margin.left - margin.right,
            height = 670 - margin.top - margin.bottom;

            // timeParse()
            // var parseDate = d3.timeParse("%d/%m/%Y");
            var parseDate = d3.timeParse("%d/%m/%Y");

            var y = d3.scaleLinear()
                .domain(d3.extent(data, function(d) return d["GBP/EUR"]))
                .range([height, 0]);

            var x = d3.scaleTime()
                .domain(d3.extent(data, function(d) return parseDate(d["Date"]); ))
                .range([0, width]);
        
    </script>
</body>

</html>

【问题讨论】:

您的对象示例具有属性EUR/USD Close,但您的代码引用GBP/EUR 【参考方案1】:

reduce代替d3.extent计算时间范围:

const width = 300;

d3.json('https://jsonblob.com/api/904557502042226688')
  .then(d => onLoad(d));
  
const onLoad = data => 
  const range = data.reduce((r, d) => 
    const time = d3.timeParse("%d/%m/%Y")(d.Date).getTime();
    if (!r) return [time, time];
    return [Math.min(time, r[0]), Math.max(time, r[1])];
  , null);
  
  const xScale = d3.scaleTime()
    .domain(range.map(t => new Date(t)))
    .range([0, width]);
    
  const xAxis = d3.axisBottom(xScale);

  d3.select('svg')
    .append('g')
    .attr('transform', 'translate(50, 50)')
    .call(xAxis);
  
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>

<svg width='400' height='100' />

【讨论】:

以上是关于d3.timeParse() 日期、月份和年份问题的主要内容,如果未能解决你的问题,请参考以下文章

在数据库中,如果只需要年份和月份,您会使用日期字段还是年份和月份字段?

如何获取带有年份的月份名称和两个日期之间的年份列表

仅将带有年份和月份的字符串转换为仅适用于年份和月份的日期格式

RDBMS:计算并打印返回日期、返回月份和返回年份 [关闭]

如何查找季度、年份、月份、学期开始和结束日期

没有日期选择的角度日期选择器(只有月份和年份)