问题描述
我目前正在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 (将#修改为@)