我有一个MySQL数据库,其中包含一个包含时间戳记登录的表格,我希望得到过去24小时内每小时的登录次数。
起初,我尝试了一些明显的事情:
SELECT
timestamp AS Hour,
COUNT(*) AS Logins
FROM auth
WHERE
timestamp >= DATE_SUB(NOW(), INTERVAL 1 DAY)
GROUP BY HOUR(timestamp)
ORDER BY timestamp DESC
这导致输出类似于以下内容:
+---------------------+--------+
| Hour | Logins |
+---------------------+--------+
| 2017-10-08 17:00:05 | 272 |
| 2017-10-08 16:00:02 | 323 |
| 2017-10-08 15:00:34 | 301 |
| 2017-10-08 14:55:10 | 30 |
| 2017-10-08 11:04:27 | 107 |
| 2017-10-08 10:06:26 | 115 |
| 2017-10-08 09:00:11 | 92 |
| 2017-10-08 08:02:34 | 195 |
| 2017-10-08 07:03:15 | 171 |
| 2017-10-08 06:03:06 | 133 |
| 2017-10-08 05:00:20 | 102 |
| 2017-10-08 04:03:23 | 198 |
| 2017-10-08 03:00:23 | 345 |
| 2017-10-08 02:01:39 | 318 |
| 2017-10-08 01:01:22 | 205 |
| 2017-10-08 00:00:24 | 334 |
| 2017-10-07 23:00:00 | 501 |
| 2017-10-07 22:00:10 | 377 |
| 2017-10-07 21:00:02 | 482 |
| 2017-10-07 20:00:04 | 349 |
| 2017-10-07 19:00:54 | 298 |
| 2017-10-07 18:13:06 | 438 |
+---------------------+--------+
22 rows in set (0,02 sec)
此输出存在两个问题。第一个是时间戳不是整个小时,因为第一次登录发生在确切小时后几分钟/秒。另外,我真的不需要输出中的日期。我通过执行以下操作解决了这个问题:
SELECT
DATE_FORMAT(DATE_ADD(timestamp, INTERVAL 30 MINUTE),'%H:00:00') AS Hour,
COUNT(*) AS Logins
FROM auth
WHERE
timestamp >= DATE_SUB(NOW(), INTERVAL 1 DAY)
GROUP BY HOUR(timestamp)
ORDER BY timestamp DESC
,输出现在是
+----------+--------+
| Hour | Logins |
+----------+--------+
| 17:00:00 | 272 |
| 16:00:00 | 323 |
| 15:00:00 | 301 |
| 15:00:00 | 30 |
| 11:00:00 | 107 |
| 10:00:00 | 115 |
| 09:00:00 | 92 |
| 08:00:00 | 195 |
| 07:00:00 | 171 |
| 06:00:00 | 133 |
| 05:00:00 | 102 |
| 04:00:00 | 198 |
| 03:00:00 | 345 |
| 02:00:00 | 318 |
| 01:00:00 | 205 |
| 00:00:00 | 334 |
| 23:00:00 | 501 |
| 22:00:00 | 377 |
| 21:00:00 | 482 |
| 20:00:00 | 349 |
| 19:00:00 | 298 |
| 18:00:00 | 452 |
+----------+--------+
22 rows in set (0,00 sec)
问题#1 :这是一个很好的方法(显示整个小时)还是有更好的方法?
第二个问题我不知道如何解决。你看,上面的命令是在当地时间18:19执行的。请注意,缺少18:00到18:19之间的登录次数。是的,我知道最后一个小时还没有结束,但是,我仍然希望显示已经过去的部分累积的数据。
问题#2 :怎么做?
答案 0 :(得分:0)
from sklearn.preprocessing import LabelBinarizer
import numpy as np
import pandas as pd
s = ['a','b','c','b','a']
df = pd.DataFrame(s, columns=["state"])
df_binarized = lb.fit_transform(df['state'])
df_binarized
Out[46]:
array([[1, 0, 0],
[0, 1, 0],
[0, 0, 1],
[0, 1, 0],
[1, 0, 0]])
答案 1 :(得分:0)
正如@kmoser指出的那样,问题来自这样一个事实:24小时期间的最后一个(不完整)小时的数据与它的第一个小时分组 - 因为小时数是相同的。为了解决这个问题,我们需要按照区分不同日期的相同时间的内容进行分组。以下是适用于我的解决方案:
SELECT
DATE_FORMAT(timestamp, '%Y-%m-%d %H:00:00') AS Hour,
COUNT(*) AS Logins
FROM auth
WHERE
timestamp >= DATE_SUB(NOW(), INTERVAL 1 DAY)
GROUP BY DATE_FORMAT(timestamp, '%Y-%m-%d %H:00:00')
ORDER BY timestamp DESC