从时间间隔数据绘制小时条形图的优雅方法?
时间:2020-03-05 18:57:52 来源:igfitidea点击:
我有一个时间表条目列表,其中显示了开始时间和停止时间。它位于一个MySQL数据库中。我需要基于此数据创建条形图,其中每天底部24小时以及一天中每个小时的工作时间。
例如,如果Alice从15:30到19:30工作,而Bob从12:15到17:00工作,则图表如下所示:
我现在有一个WTFey解决方案,其中涉及到DY列或者类似内容的电子表格。所需的分辨率为15分钟间隔。
我假设这是在数据库中最好的做法,然后将其导出以创建图表。让我知道是否缺少任何细节。谢谢。
解决方案
回答
我想出了一个伪代码解决方案,希望对我们有所帮助。
create an array named timetable with 24 entries initialise timetable to zero for each user in SQLtable firsthour = user.firsthour lasthour = user.lasthour firstminutes = 4 - (rounded down integer(user.firstminutes/15)) lastminutes = rounded down integer(user.lastminutes/15) timetable(firsthour) = timetable(firsthour) + firstminutes timetable(lasthour) = timetable(lasthour) + lastminutes for index=firsthour+1 to lasthour-1 timetable(index) = timetable(index) + 4 next index next user
现在,时间表数组以15分钟的粒度保存我们想要的值,即值4 = 1小时,5 = 1小时15分钟,14 = 3小时30分钟。
回答
创建一个表,表中的时间从午夜到午夜,其中包含一天中的每一分钟。在数据仓库世界中,我们将其称为时间维度。这是一个例子:
TIME_DIM -id -time_of_day -interval_15 -interval_30
表中数据的一个示例是
id time_of_day interval_15 interval_30 1 00:00 00:00 00:00 ... 30 00:23 00:15 00:00 ... 100 05:44 05:30 05:30
然后,我们要做的就是将表连接到时间维度,然后按interval_15分组。例如:
SELECT b.interval_15, count(*) FROM my_data_table a INNER JOIN time_dim b ON a.time_field = b.time WHERE a.date_field = now() GROUP BY b.interval_15
回答
这是从不同角度讲的另一种伪代码解决方案。更加密集,因为它每24小时执行96次查询:
results = [] for time in range(0, 24, .25): amount = mysql("select count(*) from User_Activity_Table where time >= start_time and time <= end_time") results.append(amount)
回答
这个怎么样:
使用该"时间"表,但有两列,包含15分钟的间隔。 from_times是15分钟时间,to_times是下一个from_times之前的一秒。例如12:30:00到12:44:59.
现在,使用start_time和end_time列获取人员工作表,我在这里将其称为"活动"。
我按照原始问题为Alice和Bob添加了值。
这是来自MySQL的查询:
SELECT HOUR(times.from_time) AS 'TIME', count(*) / 4 AS 'HOURS' FROM times JOIN activity ON times.from_time >= activity.start_time AND times.to_time <= activity.end_time GROUP BY HOUR(times.from_time) ORDER BY HOUR(times.from_time)
这给了我这个:
TIME HOURS 12 0.7500 13 1.0000 14 1.0000 15 1.5000 16 2.0000 17 1.0000 18 1.0000 19 0.7500
看起来不错...