在给定的日期间隔范围内,创建一天中所有1440分钟的数组,每分钟出现在源间隔中的频率

问题描述

我目前正在d3的帮助下分析我的睡眠数据,并且我的睡眠跟踪应用程序提供了一系列时间/日期来表示睡眠时间的开始和结束时间。

[
  {
    "startDate": "2017-12-25 00:09:00 +0100","endDate": "2017-12-25 00:50:00 +0100"
  },{
    "startDate": "2017-12-25 01:45:00 +0100","endDate": "2017-12-25 02:11:00 +0100"
  },{
    "startDate": "2017-12-25 02:26:00 +0100","endDate": "2017-12-25 12:37:00 +0100"
  },...
]

从这些条目中,我想创建一个直方图类型的图表,该图表显示在一天中给定的小时和分钟内我可能会入睡的可能性。因此,沿X轴将有1,440个滴答声,代表一整天的每一分钟,而横线的高度将是我在给定的那分钟睡着的可能性(使用简单的计数)。

当前,我正在创建一个所有间隔之间的所有分钟的数组(即,在上面的第一项中,将有41个对象代表00:09到00:50之间的每一分钟),然后将它们匹配一天的所有1,440分钟。当它们匹配时,将“一天中的分钟”的计数增加一。

因此,随着时间的流逝,我可以看到我可能在01:00入睡,在12:30醒着。

我大约有3,100个睡眠条目,虽然我当前的代码似乎可以正常工作,但花很长时间才能浏览我的条目(可以理解,因为地图中有地图)。如果我尝试仅在Codesandbox中的1,000个条目上运行它,则大约一分钟后都无法获得结果。

此外,……感觉效率低下。我确定必须有一种更有效的方法(我想知道是否可能有一个d3函数可以简化操作,但我找不到)。

我遇到的部分问题是知道要搜索的内容-它是直方图吗?频率图?还有吗?

import * as d3 from 'd3';
import { add,format,getHours,getMinutes } from 'date-fns';
import { flatMap,map } from 'lodash';


// For each interval in the source data,create an array of the minutes
// in that interval
// e.g. For an interval time 00:10:00 to 00:18:00,//      return 9 dates (00:10:00,00:11:00,00:12:00,etc.)

const minutesFromIntervals = flatMap(data,(interval) =>
  d3.timeMinute.range(
    new Date(interval.startDate),new Date(interval.endDate),),);


// Create an array of all the minutes in a day between midnight and
// midnight (1440 minutes)

const minutesOfDay = d3.timeMinute.range(
  new Date(2020,1),add(new Date(2020,{ hours: 24 }),);


// Map over the minutes of a day and see which interval minutes match

const results = map(minutesOfDay,(o) => {
  let count = 0;

  const outerDate = new Date(o);
  const hour = getHours(outerDate);
  const minute = getMinutes(outerDate);

  map(minutesFromIntervals,(p) => {
    const innerDate = new Date(p);
    if (getHours(innerDate) === hour && getMinutes(innerDate) === minute) {
      count += 1;
    }
  });

  return {
    key: format(o,'HH:mm'),value: count,};
});


console.log({ results });

// results (example):
// [
//   { key: "00:00",value: 0 },//   { key: "00:01",value: 1 },//   { key: "00:02",//   { key: "00:03",//   { key: "00:04",value: 2 },//   { key: "00:05",//   { key: "00:06",//   { key: "00:07",value: 3 },//   ...
// ]

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)